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.

posted @ 2014-11-15 06:56  LiBlog  阅读(147)  评论(0编辑  收藏  举报