zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/nightowc/p/4651571.html
Copyright © 2011-2022 走看看