【Golang】LeetCode 42. 接雨水

42. 接雨水

题目描述

思路

这是一道非常入门的 Hard 难度的题目,使用两个一维数组就能解决(相比之下,3D 版接雨水才是真正的 Hard)。

解决这道题目的思路如下。我们这样来思考问题,最终我们要计算的实际上就是所有位置的雨水总和,而这个位置的雨水最高不会比当前位置两侧的最高值更高(否则雨水就溢出了)。因此,我们可以使用两个数组,分别用来统计对于位置i而言,其左侧和右侧的最高高度是多少。

基于以上思路,我们可以完成某个位置两侧最高高度的统计,最后只需要完成答案的累加即可得到最终的结果。我们对原height数组的每一个位置进行一次遍历,在此期间找到两次最高高度的最小值,以它减去当前的高度height[i],就是当前位置的雨水对最终答案的贡献。这个值最少是0,原因是可能当前位置左右的最高值和当前的高度相同,这种情况会出现在左右边界,以及中间位置的峰值处。

基于以上思路,我们写代码来解决问题。

Golang 题解

go 复制代码
func trap(height []int) int {
    n := len(height)
    lmost, rmost := make([]int, n), make([]int, n)
    lmost[0], rmost[n - 1] = height[0], height[n - 1]
    for i := 1; i < n; i ++ {
        lmost[i] = max(lmost[i - 1], height[i])
    }
    for i := n - 2; i >= 0; i -- {
        rmost[i] = max(rmost[i + 1], height[i])
    }

    ans := 0
    for i := 0; i < n; i ++ {
        ans += min(lmost[i], rmost[i]) - height[i]
    }

    return ans
}

Python 题解

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        n, ans = len(height), 0
        
        lmost, rmost = [0] * n, [0] * n
        lmost[0], rmost[n - 1] = height[0], height[n - 1]
        for i in range(1, n):
            lmost[i] = max(lmost[i - 1], height[i])
        for i in range(n - 2, -1, -1):
            rmost[i] = max(rmost[i + 1], height[i])
        
        for i in range(0, n):
            ans += min(lmost[i], rmost[i]) - height[i]

        return ans
相关推荐
测试_AI_一辰4 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI4 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP5 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2085 小时前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT5 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
eBest数字化转型方案6 小时前
从工程视角拆解冰柜资产管理:拍照识别 pipeline、纯净度算法与 IoT 选型踩坑
人工智能·物联网·算法
Interview Aid1126 小时前
Roblox OA 面经|小游戏+编程双修,Coding 两题满分通过
算法
闲研随记6 小时前
【文献阅读 ICLR 2026】RL算法:Co-Rewarding
算法
青山木6 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode
疯狂打码的少年6 小时前
【数据结构】栈的应用:表达式求值(后缀表达式)
java·数据结构·笔记·算法