接雨水

· 约 1 分钟阅读 · 次阅读 leetcode

给定 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 个单位的雨水(蓝色部分表示雨水)。


动态规划

从左向右记录当前值及其左边所有数的最大值,left_max 从右向左记录right_max

class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        ans = 0
        if n <= 1:
            return ans

        left_max = [height[0]] + [0]*(n-1)
        right_max = [0]*(n-1) + [height[-1]]
        for i in range(1, n):
            left_max[i] = max(left_max[i-1], height[i])
        for i in range(n-2, -1, -1):
            right_max[i] = max(right_max[i+1], height[i])
        
        for i in range(n):
            ans += min(left_max[i], right_max[i]) - height[i]

        return ans

双指针

left_max和right_max只记录当前值,一次遍历即可 时间复杂度还是O(n) 空间复杂度将为O(1)

class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        ans = 0
        if n <= 1:
            return ans

        left = 0
        right = n-1
        left_max = 0
        right_max = 0
        while left < right:
            left_max = max(left_max, height[left])
            right_max = max(right_max, height[right])
            if left_max < right_max:
                ans += left_max - height[left]
                left += 1
            else:
                ans += right_max - height[right]
                right = right - 1
        return ans

单调栈

TODO