42. Trapping Rain Water(H)

本文详细解析了一道经典的算法题目——计算地图上积存的雨水体积。通过类比木桶原理,介绍了如何从两侧向中间遍历寻找较短边界的高效算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定n个非负整数代表一个海拔的地图,每个方块的宽度为1,计算在雨后,它能积攒的雨水的体积,原题如下,
这里写图片描述
这道题看起来挺简单的,但是一定要注意,这种题难度是Hard,肯定是不简单的,一定要考虑清楚,自己的算法能否解决所有的情况,可以先自己举几个极端但简单的例子试一下。
现在开始分析题意。这道题很想木桶装水的问题,决定木桶容量大小的在于最短的板。而这道题就像是只有两块板的木桶,能容量大小由短板来决定。比如图中的第二个积水处,左边的木板比右边的木板矮,那么就应该以左边的木板为标准,衡量水的体积。道理大概就是这个道理,现在我来描述下我的算法。
(建议结合代码来看)既然我们是以比较矮的板为标准,那么我们肯定是希望能找到左板和右板中比较矮的那一块,那么我们就要从两边开始,同时向中间找。在向中间靠拢时,哪边的板比较矮,那块板就往中间靠,,同时记录下边界板的高度,在向中间靠的过程中,如果途中的板比边界板更加矮,那么我们就可以积水,就加上这两块板的高度差。如果比边界板高,那么则以新的板为边界板。直到左右的板到中间汇合为止,代码如下

class Solution {
public:
    int trap(vector<int>& height) {
        int l = 0, r = height.size()-1, edgeHeight = 0, sum = 0, lower;
        while (l < r) {
            if (height[l] < height[r]) { // 左板低于右板,则当前边界为左板,并把左板向中间移动
                lower = height[l];
                ++l;
            } else { // 否则,当前边界为右板,并把右板向中间移动
                lower = height[r];
                --r;
            }
            edgeHeight = max(edgeHeight, lower); // 设置边界板的高度,若为新的边界,则edgeHeight == lower,不会积水
            sum += edgeHeight - lower;
        }
        return sum;
    }
};

PS:有不对或者不理解的地方欢迎提问,博主每天都会来瞄一眼~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值