Leetcode42 接雨水 Python

利用单调栈的特性

class Solution:
    """
    单调栈,维护一个从大到小的单调栈,比如[4, 3, 2, 1]
    假设我们的数据是[4, 3, 1, 0, 1, 2, 4]
    我们先组成单调栈,则stack里的元素是[4, 3, 1, 0]
    然后我们遇到1,它大于我们栈顶元素
    此时先pop出栈顶元素,记为cur
    现在栈顶元素是左边的水柱
    右边的柱子是当前元素
    然后用min取个最小值,减去cur的高度,就是存储水量,最后乘上两个水柱的距离
    将元素入栈
    
    stack = [4, 3, 1, 1]
    此时遇到2
    我们有2个1,所以都pop出去
    然后根据上面的流程计算,再入栈
    
    stack = [4, 3, 2]
    以此类推
    
    
    
    """
    def trap(self, height):
        res = 0
        stack = [] # 第一维为数字,第二维是索引
        for i in range(len(height)):
            while stack and stack[-1][0] < height[i]:
                cur = stack.pop()
                while stack and cur[0] == stack[-1][0]:
                    # 如果都是相同的元素则继续pop
                    stack.pop()
                if stack:
                    # 先取左右两边最小的柱子,再减去水柱的高度,就是能存储的雨水量
                    # 最后乘两个距离,记得-1
                    res += ((min(stack[-1][0], height[i]) - cur[0])*(i-stack[-1][1]-1))
            stack.append([height[i], i])
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值