美文网首页
LeetCode 42. 接雨水

LeetCode 42. 接雨水

作者: 草莓桃子酪酪 | 来源:发表于2022-08-17 01:32 被阅读0次
    题目

    给定 n 个非负整数表示每个宽度为 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 个单位的雨水(蓝色部分表示雨水)。

    方法:双指针法

    由上图可知接雨水的多少取决于某位置左右最高的两个主子中更矮的那个柱子

    • sum 记录接的雨水的数量

    • 循环遍历数组 height,记录每个柱子所接的雨水数量

      • 因为第一个柱子和最后一个柱子不能接雨水,那么跳过
      • lHeight 表示某位置 i 左边存在的最高柱子高度,初始值为某位置 i 左边紧挨柱子的高度 height[i-1];同理,rHeight 表示某位置 i 右边存在的最高柱子的高度,初始值为某位置 i 右边紧挨柱子的高度 height[i+1]
      • 循环遍历某位置 i 左边的所有柱子,记录最高柱子的高度 lHeight;同理,循环遍历某位置 i 右边的所有柱子,记录最高柱子的高度 rHeight
      • result 表示某个柱子所接雨水的数量,该值由其左右两边最高柱子高度的较小值 min(lHeight, rHeight) 减去当前柱子的高度 height[i] 决定。若 result 大于零,即表示可以接到雨水,那么将该雨水数量 result 加入总雨水数量 sum
    • 返回接的总雨水数量 sum

    class Solution(object):
        def trap(self, height):
            sum = 0 
            for i in range(len(height)):
                if i == 0 or i == len(height) - 1:
                    continue
                lHeight = height[i-1]
                rHeight = height[i+1]
                for j in range(i-1):
                    lHeight = max(lHeight, height[j])
                for j in range(i+2, len(height)):
                    rHeight = max(rHeight, height[j])
                result = min(lHeight, rHeight) - height[i]
                if result > 0:
                    sum += result
            return sum
    
    参考

    代码相关:https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html

    相关文章

      网友评论

          本文标题:LeetCode 42. 接雨水

          本文链接:https://www.haomeiwen.com/subject/stykgrtx.html