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!
Analysis:
We scan the whole array twice. First: from head to end; Second: from end to start.
In every scan, we record the current bar for rain trapping. If the value of current column is less than the bar, then current store += bar-currentValueOfColumn; Else, current store is end, we then add the current store into the total store, and reset the bar as currentValueOfColumn.
Solution:
1 public class Solution { 2 public int trap(int[] A) { 3 if (A.length==0) return 0; 4 if (A.length==1) return 0; 5 int index = 1; 6 int bar = A[0]; 7 int total = 0; 8 int curStore = 0; 9 boolean[] count = new boolean[A.length]; 10 11 //We need to record which column has been counted during the first scan. 12 for (int i=0;i<count.length;i++) count[i] = false; 13 List<Integer> countList = new ArrayList<Integer>(); 14 15 while (index<A.length){ 16 int curBar = A[index]; 17 if (curBar<bar){ 18 curStore+= (bar-curBar); 19 countList.add(index); 20 } else { 21 total += curStore; 22 curStore = 0; 23 bar = curBar; 24 for (int i=0;i<countList.size();i++) count[countList.get(i)]=true; 25 countList.clear(); 26 } 27 index++; 28 } 29 30 bar = A[A.length-1]; 31 index = A.length-2; 32 curStore = 0; 33 while (index>=0){ 34 int curBar = A[index]; 35 if (curBar<bar && !count[index]) 36 curStore+= (bar-curBar); 37 else if (curBar>bar){ 38 total += curStore; 39 curStore = 0; 40 bar = curBar; 41 } 42 index--; 43 } 44 45 46 return total; 47 } 48 }
NOTE: We need to record which column has been counted in the first scan, we then ignor these column in the second scan.