給定一個整數數組 height
,每個元素表示一個柱子的高度,其中每個柱子的寬度為 1
,請計算柱子之間可以容納多少雨水。
範例 1:
輸入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
範例 2:
輸入: height = [4,2,0,3,2,5]
輸出: 9
這是一個經典的動態規劃與雙指針問題。
對於每個柱子,找到其左側和右側的最大高度,計算可以容納的雨水量。
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
n = len(height)
if n == 0:
return 0
water_trapped = 0
for i in range(n):
# 找到左側最大高度
left_max = max(height[:i+1])
# 找到右側最大高度
right_max = max(height[i:])
# 計算雨水量
water_trapped += min(left_max, right_max) - height[i]
return water_trapped
用兩個數組 left_max
和 right_max
分別保存每個柱子的左側和右側最大高度,避免暴力解法中重複計算。
class Solution(object):
def trap(self, height):
n = len(height)
if n == 0:
return 0
# 預處理左側和右側最大高度
left_max = [0] * n
right_max = [0] * n
left_max[0] = height[0]
for i in range(1, n):
left_max[i] = max(left_max[i-1], height[i])
right_max[n-1] = height[n-1]
for i in range(n-2, -1, -1):
right_max[i] = max(right_max[i+1], height[i])
# 計算存水量
water_trapped = 0
for i in range(n):
water_trapped += min(left_max[i], right_max[i]) - height[i]
return water_trapped
使用兩個指針 left
和 right
來替代 left_max
和 right_max
數組,只需維護當前的左右最大高度即可。
left
和 right
,分別指向數組的開頭和結尾。left_max
和 right_max
。class Solution(object):
def trap(self, height):
n = len(height)
if n == 0:
return 0
left, right = 0, n - 1
left_max, right_max = 0, 0
water_trapped = 0
while left < right:
if height[left] < height[right]:
if height[left] >= left_max:
left_max = height[left]
else:
water_trapped += left_max - height[left]
left += 1
else:
if height[right] >= right_max:
right_max = height[right]
else:
water_trapped += right_max - height[right]
right -= 1
return water_trapped
你可以根據自己的熟悉程度選擇適合的解法!