42. 接雨水

题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

【分析】动态编程。
left_max记录从index=i到最左边最高的height之间的距离
right_max记录从index到最右边最高的height之间的距离

中间利用left和right记录临时的最高height。

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        n=len(height)
        left,right=0,0
        left_max,right_max=range(n),range(n)
        for i in range(n):
            if left<height[i]:
                left=height[i]
            left_max[i]=left-height[i]
            if right<height[n-i-1]:
                right=height[n-i-1]
            right_max[n-i-1]=right-height[n-i-1]
        return sum([min(right_max[i],left_max[i]) for i in range(n)])  

【分析2】利用单调减栈,计算凹槽的面积。
栈内存入height的index。
1.维护栈单调递减的原则,如果遇到height比栈中的height大的情况,弹出栈中元素,作为凹槽底的高度bottom=stack.pop()
2.计入面积的高度,min(height[i],height[stack[-1]])-height[bottom]
3.计入面积的宽度,i-stack[i]-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值