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)。
相关推荐
罗西的思考10 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer10 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
文丑颜不良啊12 小时前
LeetCode51~75题目解析
leetcode
高晶12 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
ysbfsy12 小时前
大数计算思路
算法
高晶12 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
学电子她就能回来吗12 小时前
LeetCode Hot 100|普通数组专题学习笔记(零基础版)
笔记·算法·leetcode
用户老李13 小时前
反向传播计算梯度举例
算法
niyongsheng13 小时前
多智能体连续时间内路径规划:AA-SIPP(m) 的 Rust 实现与算法
算法·rust·机器人
302wanger13 小时前
DeepSeek-V4.1-Flash-1017 免费用到1024,速来
算法