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.

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

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 }

 

你可能感兴趣的:(twitter)