LC42 接雨水
1 题目
给定 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.length1 <= n <= 2 * 1040 <= 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

浙公网安备 33010602011771号