[LeetCode42]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!

思路,坐标的最大左右边相减就是该坐标点容积

1. 从左到右扫描,找出每个坐标的最大左值 

2. 从右到左扫描,找出每个坐标最大右值

3. 累加每个容积。

001 122 223 333每点最大左值

333 333 322 211每点最大右值

001 122 222 211每点最小的左右最大值

010 210 132 121原始值

相差为每点容积

001 012 100 100 =6

c++

int trap(int A[], int n) {
    if(n<2) return 0;
    int *maxL = new int[n], *maxR = new int[n];
    int maxLR = A[0];
    maxL[0] = 0;
    //from left to right cal max lvalue
    for(int i=1; i<n-1; i++){
        maxL[i] = maxLR;
        if(A[i]>maxLR){
            maxLR = A[i];
        }
    }
    maxLR = A[n-1];
    maxR[n-1] = 0;
    int ttrap = 0, ctrap = 0;
    for(int i=n-2; i>0;i--){
        maxR[i] = maxLR;
        ctrap = min(maxL[i], maxR[i]) - A[i];
        if(ctrap>0)
            ttrap+= ctrap;
        if(maxLR < A[i])
            maxLR = A[i];
    }
    delete maxL, maxR;
    return ttrap;

}

java

public int trap(int[] A) {
		if(A.length<2) return 0;
		int len = A.length;
		int []maxL = new int [len];
		int maxLR = A[0];
		maxL[0] = 0;
		for(int i=1;i<len;i++){
			maxL[i] = maxLR;
			if(A[i]>maxLR)
				maxLR = A[i];
		}
		maxLR = A[len-1];
		int []maxR = new int[len];
		maxR[len-1] = 0;
		int trap = 0;
		for(int i=len-2;i>=0;i--){
			maxR[i] = maxLR;
			int ctrap = Math.min(maxL[i], maxR[i])-A[i];
			if(ctrap>0) trap+=ctrap;
			if(A[i]>maxLR)
				maxLR = A[i];
		}
		return trap;
    }

你可能感兴趣的:(LeetCode,水箱)