標籤:
【演算法題:求出高低不同的磚中能存多少水】
「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-q35 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-p45 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-end58 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 }
Twitter演算法面試題詳解(Java實現)——Trapping Rain Water