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號