2014年2月21日星期五

LeetCode - Trapping Rain Water

 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.



The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

public class Solution {
    public int trap(int[] A) {
        if(A==null || A.length<=2) {
            return 0;
        }
        int water = 0;
        int max = 0;
        int maxLeft[] = new int[A.length];
        int maxRight[] = new int[A.length];
        for(int i=0;i<A.length;i++) {
            maxLeft[i] = max;
            max = Math.max(max, A[i]);
        }
        max = 0;
        for(int i=A.length-1;i>=0;i--) {
            maxRight[i] = max;
            max = Math.max(max, A[i]);
        }
        for(int i=1;i<A.length-1;i++) {
            int min = Math.min(maxLeft[i], maxRight[i]);
            if(A[i]<min) {
                water += min - A[i];
            }
        }
        return water;
    }
}

=============
public class Solution {
    public int trap(int[] A) {
        int n = A.length;
        int left=0; int right=n-1;
        int res=0;
        int maxleft=0, maxright=0;
        while(left<=right){
            if(A[left]<=A[right]){
                if(A[left]>=maxleft) maxleft=A[left];
                else res+=maxleft-A[left];
                left++;
            }
            else{
                if(A[right]>=maxright) maxright= A[right];
                else res+=maxright-A[right];
                right--;
            }
        }
        return res;
    }

}

没有评论:

发表评论