
方法一:
python
class Solution:
def trap(self, height: list[int]) -> int:
n=len(height)
pre_max=[0]*n # pre_max[i] 表示从 height[0] 到 height[i] 的最大值
pre_max[0]=height[0]
for i in range(1,n):
pre_max[i]=max(pre_max[i-1],height[i])
suf_max=[0]*n # suf_max[i] 表示从 height[i] 到 height[n-1] 的最大值
suf_max[-1]=height[n-1]
for i in range(n-2,-1,-1):
suf_max[i]=max(suf_max[i+1],height[i])
ans=0
for i in range(0,n):#for h, pre, suf in zip(height, pre_max, suf_max):
ans+=min(pre_max[i],suf_max[i])-height[i] # 累加每个水桶能接多少水
return ans
- 时间复杂度:O(n),其中 n 是 height 的长度。
- 空间复杂度:O(n)。
zip(*iterables) 是内置函数,把多个可迭代对象按位置配对打包,返回一个 zip 迭代器 。
a = 1,2,3
b = "x","y","z"
z = zip(a,b)
print(z) # <zip object at 0x...> 迭代器
转list查看结果
print(list(z))
(1, 'x'), (2, 'y'), (3, 'z') =>元组的列表
names = "Alice","Bob"
ages = 20,22
for name, age in zip(names, ages):
print(name, age) =》name,age分别取值
方法二:
python
class Solution:
def trap(self, height: list[int]) -> int:
ans = pre_max = suf_max = 0
left, right = 0, len(height) - 1
while left < right:
pre_max = max(pre_max, height[left]) # 前缀最大值
suf_max = max(suf_max, height[right]) # 后缀最大值
if pre_max < suf_max: # 可以确定 left 处的接水量
ans += pre_max - height[left]
left += 1 # 搞定了 left,现在问题缩小到 [left+1, right]
else: # 可以确定 right 处的接水量
ans += suf_max - height[right]
right -= 1 # 搞定了 right,现在问题缩小到 [left, right-1]
return ans
- 时间复杂度:O(n),其中 n 是 height 的长度。
- 空间复杂度:O(1)。