☰
LeetCode-42. 接雨水
2026/9/30 4:43:31 网站建设 项目流程


方法一:

classSolution:deftrap(self,height:list[int])->int:n=len(height)pre_max=[0]*n# pre_max[i] 表示从 height[0] 到 height[i] 的最大值pre_max[0]=height[0]foriinrange(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]foriinrange(n-2,-1,-1):suf_max[i]=max(suf_max[i+1],height[i])ans=0foriinrange(0,n):#for h, pre, suf in zip(height, pre_max, suf_max):ans+=min(pre_max[i],suf_max[i])-height[i]# 累加每个水桶能接多少水returnans
  • 时间复杂度: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分别取值

方法二:

classSolution:deftrap(self,height:list[int])->int:ans=pre_max=suf_max=0left,right=0,len(height)-1whileleft<right:pre_max=max(pre_max,height[left])# 前缀最大值suf_max=max(suf_max,height[right])# 后缀最大值ifpre_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]returnans
  • 时间复杂度:O(n),其中 n 是 height 的长度。
  • 空间复杂度:O(1)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询