单调栈应用题目

单调栈专题,可以按照这个列表来刷。

  • [LeetCode-42] 接雨水
  • [LeetCode-239] 滑动窗口最大值
  • [LeetCode-496] 下一个更大元素 I
  • [LeetCode-503] 下一个更大元素 II
  • [LeetCode-739] 每日温度
  • [LeetCode-901] 股票价格跨度
  • [HDU-5749] Colmerauer
  • [HDU-4252] A Famous City
  • [HDU-1506] Largest Rectangle in a Histogram
  • [HDU-6319] Ascending Rating
  • 最大矩形面积

1. 接雨水

# 最小栈接雨水
nums = [0,1,0,2,1,0,1,3,2,1,2,1]
def trap(height):
    if not height:
        return 0
    stack = []
    res = 0
    for i in range(len(height)):
        if stack:
            # 单调减,入栈
            if height[i] <= height[stack[-1]]:
                stack.append(i)
            else:
                # 如果当前柱子都要比栈顶元素大,可以存储雨水,while循环里计算满足接水条件
                while height[i] > height[stack[-1]]:
                    stack_top = stack.pop()
                    # pop之后检测是否还有元素,且栈顶元素高度等于前面弹出的高度,继续
                    while stack and height[stack[-1]] == height[stack_top]:
                        stack_top = stack.pop()
                    if stack:
                        res += (i - stack[-1] -1) * (min(height[i], height[stack[-1]]) - height[stack_top])
                    else:
                        break   # 不计算了
                stack.append(i)
        else:
            if height[i] != 0:
                stack.append(i)   # 入栈&等于零不入栈
    return res
trap(nums)

 

posted @ 2022-07-23 18:07  今夜无风  阅读(27)  评论(0)    收藏  举报