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 }
  • 相关阅读:
    tomact与eclipces的配置
    IDEA中Flink环境pom.xml文件配置
    python读写mysql
    用pyspark实现Wordcount
    python计算相似度
    Spark读取mysql
    Spark之WordCount
    IDEA中Spark环境pom.xml文件配置
    Spark之HelloWorld
    (转)二叉树的中序遍历与后序遍历构造二叉树思路(递归方法,含图片说明)
  • 原文地址:https://www.cnblogs.com/nightowc/p/4651571.html
Copyright © 2011-2022 走看看