题目链接是:https://leetcode.com/problems/trapping-rain-water/description/
这个题目,我的思路是数面积,可一直error,然后就去分析大神思路了。。。
AC代码如下:
int trap(vector<int>& height) {
int l = 0, r = height.size()-1, level = 0, water = 0;
while (l < r) {
int lower = height[height[l] < height[r] ? l++ : r--];
level = max(level, lower);
water += level - lower;
}
return water;
}
直接看代码来描述呢,太过抽象,我还是模拟每次的变化来说吧。
假设输入b={0,1,0,2,1,0,1,3,2,1,2,1},这是题目的例子。
1:lower=height[0]=0 level=0 water=0
2:lower=height[11]=1 level=1 water=0
3:lower=height[1]=1 level=1 water=0
4:lower=height[2]=0 level=1 water=1
5:lower=height[10]=2 level=2 water=1
6:lower=height[9]=1 level=2 water=2
7:lower=height[3]=2 level=2 water=2
8:lower=height[8]=2 level=2 water=2
9:lower=height[4]=1 level=2 water=3
10:lower=height[5]=0 level=2 water=5
11:lower=height[6]=1 level=2 water=6
从两端开始扫描,一直选取最小的墙,因为水的高只能根据最小的墙的高度来算。
level一直是扫描中,两个墙中较高的一个墙,lower是较低的一个,两者作差就是它们之间这里拦住的水的高度。为什么呢?
我们拿height[4]和height[8]来举例,height[4]=1,height[8]=2,说明先前的height[3]=2>=height[8],我们才选出了height[8],那么这时就保证了height[4]的左边height[3]和右边height[8]都是高于height[4]的。那么把他们三个抽出来,height[4]作为木桶底部,height[8]作为木桶短板,而height[3]作为木桶高板,那么height[8]-height[4]就是能装的水的高,这里统一宽度为1。
其实我也理解的有些模糊,我觉得就是这样,有更好的理解的朋友,欢迎讨论。
我就是记录一下自己做的~