单调栈应用题目

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

  • [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 @   今夜无风  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示