class Solution {
    public int trap(int[] height) {
        int left = 0;
        int right = height.length-1;
        
        int maxL = 0;
        int maxR = 0;
        int ans=0;
        while(left<right){
            if(height[left]<height[right]){
                if(height[left]<maxL){
                    ans+=maxL-height[left];
                }else{
                    maxL = height[left];
                }
                left++;
            }else{
                if(height[right]<maxR){
                    ans+=maxR-height[right];
                }else{
                    maxR = height[right];
                }
                right--;
            }
        }
        return ans;
    }
}
  • 2.6

    • 先判断大边哪个是短板,判断当前的短板和之前的最大高度
      • 如果如果高于最高高度,存不住水
      • 如果低于最高高度,可以存水,总 ans+=当前水量
  • 1.22

    • 算是中等题
class Solution {
    public int trap(int[] height) {
        int left = 0;
        int right = height.length - 1;
        
        int leftMax = 0;
        int rightMax = 0;
        
        int ans = 0;
 
        while (left < right) {
            // 每次比较左右两根柱子,处理较矮的那一侧
            // 为什么?因为水桶的容量取决于短板。
            
            // 情况一:左边是短板
            if (height[left] < height[right]) {
                // 如果当前柱子比左边历史最高的还要高,那它自己就是新的墙,存不住水
                if (height[left] >= leftMax) {
                    leftMax = height[left];
                } else {
                    // 否则,它是低谷,能存水。存水量 = 左边墙 - 当前高度
                    // (不用管右边墙,因为进入这个 if 分支就意味着右边肯定有比左边高的)
                    ans += (leftMax - height[left]);
                }
                left++;
            } 
            // 情况二:右边是短板(或者一样高)
            else {
                if (height[right] >= rightMax) {
                    rightMax = height[right];
                } else {
                    ans += (rightMax - height[right]);
                }
                right--;
            }
        }
        return ans;
    }
}