zoukankan      html  css  js  c++  java
  • Leetcode-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. Thanks Marcos for contributing this image!

    Analysis:

    We scan the whole array twice. First: from head to end; Second: from end to start.

    In every scan, we record the current bar for rain trapping. If the value of current column is less than the bar, then current store += bar-currentValueOfColumn; Else, current store is end, we then add the current store into the total store, and reset the bar as currentValueOfColumn.

    Solution:

     1 public class Solution {
     2     public int trap(int[] A) {
     3         if (A.length==0) return 0;
     4         if (A.length==1) return 0;
     5         int index = 1;
     6         int bar = A[0];
     7         int total = 0;
     8         int curStore = 0;
     9         boolean[] count = new boolean[A.length];
    10         
    11         //We need to record which column has been counted during the first scan. 
    12         for (int i=0;i<count.length;i++) count[i] = false;
    13         List<Integer> countList = new ArrayList<Integer>();
    14         
    15         while (index<A.length){
    16             int curBar = A[index];
    17             if (curBar<bar){
    18                 curStore+= (bar-curBar);
    19                 countList.add(index);
    20             } else {
    21                 total += curStore;
    22                 curStore = 0;
    23                 bar = curBar;
    24                 for (int i=0;i<countList.size();i++) count[countList.get(i)]=true;
    25                 countList.clear();
    26             }
    27             index++;
    28         }
    29 
    30         bar = A[A.length-1];
    31         index = A.length-2;
    32         curStore = 0;
    33         while (index>=0){
    34             int curBar = A[index];
    35             if (curBar<bar && !count[index])
    36                 curStore+= (bar-curBar);
    37             else if (curBar>bar){
    38                 total += curStore;
    39                 curStore = 0;
    40                 bar = curBar;
    41             } 
    42             index--;
    43         }
    44 
    45 
    46         return total;      
    47     }
    48 }

    NOTE: We need to record which column has been counted in the first scan, we then ignor these column in the second scan.

  • 相关阅读:
    AVAYA语音通知管理
    如何打出强烈低杆
    iSCSI存储技术全攻略
    域控制器的管理注意事项
    Ogre的ExampleApplication阅读
    CEImagesetEditor编译过程
    Ogre基础教程遇到的问题
    SQLServer中进行sql除法运算结果为小数时显示0的解决方案
    【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 ImageButton
    silverlight,WPF动画终极攻略之白云飘,坐车去旅游篇(Blend 4开发)
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4098665.html
Copyright © 2011-2022 走看看