LeetCode-42. 接雨水

方法一:

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)。
相关推荐
希和202727 分钟前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
Pniubi42 分钟前
力扣73 矩阵置零
算法·leetcode·矩阵
布莱克60511 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
D e re k ZH14 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
石小石Orz15 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
民乐团扒谱机16 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
青少儿编程课堂16 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
文丑颜不良啊17 小时前
LeetCode2261~2280题目解析
java·leetcode
武子康18 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习