LC42 接雨水


1 题目

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

示例 1:

img

输入: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
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

2 解答

1 双指针

class Solution:
    def trap(self, height: List[int]) -> int:
        
        # 2 双向指针
        n = len(height)
        right = n - 1
        left = 0
        pre_max = height[left]
        sur_max = height[right]
        ans = 0
        while left<right:
            # 如果前缀最大值小于后缀最大值,则接到的水就是前缀最大值减去本身的高度
            if pre_max < sur_max :
                ans += pre_max - height[left]
                left += 1
                pre_max = max(pre_max, height[left])
                
            # 如果后缀最大值小于前缀最大值,则接到的水就是后缀最大值减去其本身的高度
            if pre_max >= sur_max:
                ans += sur_max - height[right]
                right -= 1
                sur_max = max(sur_max , height[right])
        return ans

前后缀解方

class Solution:
    def trap(self, height: List[int]) -> int:
        # 1. 左右最高的最小减去本身即可
        n = len(height)
        pre_max = [0]*n
        sur_max = [0]*n
        pre_max[0] = height[0]
        sur_max[n-1] = height[n-1]
        ans = 0
        # 前缀最大值
        for i in range(1 , n , 1):
            pre_max[i] = max(height[i] , pre_max[i-1])
            
        # 后缀最大值
        for j in range(n-2 , -1 , -1):
            sur_max[j] = max(height[j] , sur_max[j+1])
            
        # 求解
        for i in range(0 , n , 1):
            ans += min(pre_max[i] , sur_max[i]) - height[i]
        return  ans
posted @ 2025-08-26 09:34  AxonoSensei  阅读(5)  评论(0)    收藏  举报