【算法题:求出高低不同的砖中能存多少水】
「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 }