题目:
给定n个代表海拔图的非负整数,其中每个条的宽度为1,计算下雨后它能捕获多少水。
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路:
从两边开始,最左和最右比较,从较小的那一方开始,因为这样的话从这边开始的每一步的计算的都可以能够把水积住(因为短板效应)。设置左右的最大值,然后往中间去的过程中改变该值,如果遇见小于max的值,就用ta和max的差加到res中。
code:
class Solution {
public:
int trap(vector<int>& height) {
int left=0;
int right=height.size()-1;
int maxleft=0,maxright=0; //灭有初始化错误
int res=0;
//当相遇到中间,说明两个的背后已经计算完毕
while(left<=right){
if(height[left]<= height[right]){
//左边小从左边开始
if(height[left] >=maxleft)
maxleft=height[left];
else res+= maxleft-height[left];
left++; //注意,他是先计算后再--的!
}
else
{
if(height[right]>= maxright) maxright=height[right];
else res+= maxright-height[right];
right--;
}
}
return res;
}
};