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; }