面试题 17.21. Volume of Histogram LCCI
仅供自己学习
思路:
因为要求接水的最大单位数,那么需要知道两侧的的高度。但如果遍历每一个位置再向两侧展开会很绕,需要很多if条件。如果我们从两侧向中间靠近则会容易理解得多。我们设置两个指针left和right,left指向第一个位置,right指向最后一个位置,在定义leftmax和rightmax分别记录left和right遍历过的最高的位置的高度。我们判断height[left]和height[right]谁更大,如果height[left]>height[right]那么leftmax>rightmax,因为leftmax和rightmax每次循环都会先重新取最大值,否则矛盾。此时说明right是可以存水的,因为如果height[right]>原rightmax,那么righmax就会更新为height[right],这样也设为可以装水,不过装水量为0,其余情况就为rightmax-height[right]。对的,我们这样做没有直接判断right这个位置的左侧有没有位置的高度能装水,但是这里有个leftmax>rightmax的条件,只要我height[right]<righmax,那么我们就可以一直加水,虽然左侧没有确定有没有位置,但如果加到leftmax,那么这个过程加的水一定能够装得了。每次装一次水就将该rifht或者left++,一个移动另一个不移动就能满足。
配合着代码会更好理解:
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
int res=0;
int right=n-1,left=0;
int leftmax=0,rightmax=0;
while(left<right){
leftmax=max(leftmax,height[left]);
rightmax=max(rightmax,height[right]);
if(height[left]<height[right]){
res+=leftmax-height[left];
left++;
}
else {
res+=rightmax-height[right];
right--;
}
}
return res;
}
};

浙公网安备 33010602011771号