首页 > 其他 > 详细

LeetCode 42. 接雨水

时间:2021-04-03 19:56:57      阅读:24      评论:0      收藏:0      [点我收藏+]

42. 接雨水

Difficulty: 困难

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

技术分享图片

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 0 <= n <= 3 * 10<sup>4</sup>
  • 0 <= height[i] <= 10<sup>5</sup>

Solution

只要知道柱子i位置最多能盛的水等于这个柱子的左边和右边格子最大值中的最小值min(l[i], r[i])减去height[i],如果提前把每个柱子的左边和右边的最大l[i]和最大值r[i]提前求出来,然后就能很快速地把每个柱子最多能盛的水算出来。

class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        if n == 0:
            return 0
        
        l = [height[0]] + [0] * (n - 1)
        r = [0] * (n - 1) + [height[-1]]
        
        for i in range(1, n):
            l[i] = max(height[i], l[i-1])
        
        for j in range(n-2, -1, -1):
            r[j] = max(height[j], r[j+1])
        
        res = 0
        for k in range(n):
            res += min(l[k], r[k]) - height[k]
        return res

LeetCode 42. 接雨水

原文:https://www.cnblogs.com/swordspoet/p/14613899.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!