42. Trapping Rain Water via Java

一道难点并不在于编程和逻辑的算法题,更像是脑筋急转弯

从左右两侧向中间移动两根指针,同时保留两侧最大值

class Solution {
    public int trap(int[] height) {
        if (height==null||height.length < 3) {
            return 0; // impossible to contain water in this situation
        }
        
        int left = 0; //initiate left pointer
        int right = height.length - 1; //initiate right pointer
        int leftMax = height[left]; //the bound in left
        int rightMax = height[right];//the bound in right
        int res = 0;
        
        while (left < right) {
            if (height[left] <= height[right]) {
                if (height[left] > leftMax) {
                    leftMax = height[left++];
                } else {
                    res += leftMax - height[left++];
                }
            } else {
                if (height[right] > rightMax) {
                    rightMax = height[right--];
                } else {
                    res += rightMax - height[right--];
                }
            }
        }
        return res;
    }
}

time: O(n)

space: O(1)

posted @ 2019-11-23 16:39  La_Campanella  阅读(111)  评论(0编辑  收藏  举报