Loading

接雨水问题的实现

方案一:双指针

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        if(height == null || n < 3){
            return 0;
        }
        int ans = 0;
        int[] left = new int[n];
        int[] right = new int[n];
        left[0] = height[0];
        right[n-1] = height[n-1];
        for(int i = 1; i < n; i++){
            left[i] =  left[i-1] > height[i] ? left[i-1] : height[i];
        }
        for(int j = n-2; j >= 0; j--){
            right[j] = right[j+1] > height[j] ? right[j+1] : height[j];
        }
        for(int k = 1; k < n; k++){
            ans += Math.min(left[k], right[k]) - height[k];
        }
        return ans;
    }
}

方案二:单调递减栈

class Solution {
    public int trap(int[] height) {
        int len = height.length;
        int ans = 0;
        Stack<Integer> stack = new Stack<Integer>();
        for(int i = 0; i < len; i++){
            while(!stack.empty() && height[i] > height[stack.peek()]){
                int cur = stack.pop();
                if(stack.empty()){
                    break;
                }
                int l = stack.peek();
                int r = i;
                int h = Math.min(height[l],height[r]) - height[cur];
                ans += (r - l - 1) * h;
            }
            stack.push(i);
        }
        return ans;
    }
}
posted @ 2021-01-08 15:43  JesseKkk  阅读(99)  评论(0)    收藏  举报