第四章:如何高效解决接雨水问题

labuladong 如何高效解决接雨水问题

42. 接雨水

我们开两个数组 l_max 和 r_max 充当备忘录

  • l_max[i] 表示位置 i 左边最高的柱子高度(包括本身在内,正着遍历), r_max[i] 表示位置 i 右边最高的柱子高度(包括本身在内,倒着遍历)。位置 i 能保存的最大的水柱高度就是 min(l_max, r_max)- height[i]
  • 初始化时,首柱子左边最大为自己:l_max[0]=height[0]。尾柱子右边最大为自己:r_max[n-1]=height[n-1]
  • 预先把这两个数组计算好,避免重复计算
class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height: return 0
        #初始化
        n=len(height)
        l_max=[0]*n
        r_max=[0]*n
        l_max[0]=height[0]
        r_max[n-1]=height[n-1]

        # 计算i对应的左右最大值
        for i in range(1,n):
            l_max[i]=max(l_max[i-1],height[i])
        for i in range(n-2,-1,-1):
            r_max[i]=max(r_max[i+1],height[i])

        # 计算面积
        ans=0
        # 也可以从1开始,for i in range(1,n): 第0个位置存不住水,面积为0
        for i in range(n): 
            ans+=min(l_max[i],r_max[i])-height[i]
        return ans

   转载规则


《第四章:如何高效解决接雨水问题》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
第四章:如何去除有序数组的重复元素 第四章:如何去除有序数组的重复元素
labuladong 如何去除有序数组的重复元素 用快慢指针解决问题(两种初始化都可以) slow,fast=0,0 slow,fast=head,head 或者 slow,fast=0,1 slow,fast=head,head.next
2020-08-18
下一篇 
第四章:如何运用二分查找算法 第四章:如何运用二分查找算法
labuladong 如何运用二分查找算法 875. 爱吃香蕉的珂珂 canFinish() 函数:当前速度下,能吃完的小时数(注意要向上整除) 最小速度为1,最大速度为数组中最大值。因此利用二分查找框架求h(h相当于二分查找中的目
2020-08-17
  目录