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.

  • 相关阅读:
    Solr4:加入中文分词IKAnalyzer2012 FF
    Solr4:Hello World级别示范
    Solr4:Tomcat7下面配置Solr
    Java:XML篇,使用DOM读取并解析XML
    Solr4:加入中文分词mmseg4j
    Java:XML篇,使用SAX读取并解析XML数据
    SSIS包如何动态指定文件路径
    如何定时执行SSIS包
    用户控件使用事件
    用户控件使用事件与调用页面交互
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4098665.html
Copyright © 2011-2022 走看看