面试题 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;
    }
};
posted @ 2021-04-02 10:05  Mrsdwang  阅读(55)  评论(0)    收藏  举报