Twitter算法面试题详解(Java实现)——Trapping Rain Water

【算法题:求出高低不同的砖中能存多少水】

「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. 

解法思路:先找出数列中最左和最右的数值最大值,序列号为p、q(若最大值唯一则p、q相同),然后分三段计算存水量,具体代码如下:

 1 /*
 2  * 算法题:求高低不同的砖中能存多少水
 3  */
 4 
 5 import java.util.ArrayList;
 6 import java.util.List;
 7 
 8 public class FillWater {
 9 
10     public static void main(String[] args) {
11 
12         int num[] = { 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 };
13         List<Integer> stone = new ArrayList<Integer>();
14         for (int i = 0; i < num.length; i++) {
15             stone.add(num[i]);
16         }
17         int result = 0;
18         int p = 0, q = 0;// 找出左右最高点序号
19         for (int j = 0; j < stone.size(); j++) {
20             if (stone.get(j) > stone.get(p)) {
21                 p = j;
22                 q = j;
23             } else if (stone.get(j) == stone.get(p)) {
24                 q = j;
25             }
26             System.out.println("p: " + p + " , q: " + q);
27         }
28         result += calcL(stone.subList(0, p + 1)) + calcH(stone.subList(p, q + 1))
29                 + calcR(stone.subList(q, stone.size()));
30 
31         System.out.println("result: " + result);
32     }
33 
34     // 处理中段:p-q
35     static int calcH(List<Integer> a) {
36         int waterHigh = 0;
37         for (int i = 0; i < a.size(); i++) {
38             waterHigh += a.get(0) - a.get(i);
39         }
40         System.out.println("waterHigh: " + waterHigh);
41         return waterHigh;
42     }
43 
44     // 处理左段:0-p
45     static int calcL(List<Integer> a) {
46         int waterLeft = 0;
47         for (int i = 1; i < a.size(); i++) {
48             if (a.get(i) < a.get(i - 1)) {
49                 waterLeft += a.get(i - 1) - a.get(i);
50                 a.set(i, a.get(i - 1));
51             }
52         }
53         System.out.println("waterLeft: " + waterLeft);
54         return waterLeft;
55     }
56 
57     // 处理右段:q-end
58     static int calcR(List<Integer> a) {
59         int waterRight = 0;
60         for (int i = a.size() - 2; i > 0; i--) {
61             if (a.get(i) < a.get(i + 1)) {
62                 waterRight += a.get(i + 1) - a.get(i);
63                 a.set(i, a.get(i + 1));
64             }
65         }
66         System.out.println("waterRight: " + waterRight);
67         return waterRight;
68     }
69 
70 }
原文地址:https://www.cnblogs.com/nightowc/p/4651571.html