题目描述
给定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:有不对或者不理解的地方欢迎提问,博主每天都会来瞄一眼~