单调栈算法

单调栈算法

1. 核心思想

单调栈是一种特殊的栈结构,栈内元素保持单调性(递增或递减)。主要用于解决寻找下一个更大/更小元素的问题。

2. 适用场景

  • 寻找每个元素左/右侧第一个比它大/小的元素
  • 柱状图中最大矩形面积
  • 接雨水问题
  • 股票价格跨度

3. 模板代码

单调递减栈(找下一个更大元素)

def nextGreaterElement(nums):
    n = len(nums)
    result = [-1] * n  # 初始化结果数组
    stack = []  # 存储索引
  
    for i in range(n):
        # 当前元素大于栈顶元素时,栈顶元素找到了下一个更大元素
        while stack and nums[i] > nums[stack[-1]]:
            index = stack.pop()
            result[index] = nums[i]
        stack.append(i)
  
    return result

单调递增栈(找下一个更小元素)

def nextSmallerElement(nums):
    n = len(nums)
    result = [-1] * n
    stack = []
  
    for i in range(n):
        # 当前元素小于栈顶元素时,栈顶元素找到了下一个更小元素
        while stack and nums[i] < nums[stack[-1]]:
            index = stack.pop()
            result[index] = nums[i]
        stack.append(i)
  
    return result

4. 经典例题

例1: 每日温度

def dailyTemperatures(temperatures):
    """
    给定一个列表,返回需要等待多少天才能遇到更高的温度
    """
    n = len(temperatures)
    result = [0] * n
    stack = []
  
    for i in range(n):
        while stack and temperatures[i] > temperatures[stack[-1]]:
            prev_index = stack.pop()
            result[prev_index] = i - prev_index
        stack.append(i)
  
    return result

例2: 柱状图中最大矩形

def largestRectangleArea(heights):
    """
    使用单调递增栈
    """
    stack = []
    max_area = 0
    heights.append(0)  # 哨兵,确保所有元素都出栈
  
    for i in range(len(heights)):
        while stack and heights[i] < heights[stack[-1]]:
            h = heights[stack.pop()]
            w = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, h * w)
        stack.append(i)
  
    return max_area

例3: 接雨水

谁是Nick? 2026-03-10
拯救2c2g资源的Openclaw 2026-03-25

评论区