首页 > 代码库 > Leetcode-Trapping Rain Water
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.
Leetcode-Trapping Rain Water