zoukankan      html  css  js  c++  java
  • LeetCode: Trapping Rain Water 解题报告

    https://oj.leetcode.com/problems/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. Thanks Marcos for contributing this image!

    SOLUTION 1:

    从左到右扫描,计算到从左边到curr的最高的bar,从右到左扫描,计算到从右边到curr的最高的bar。

    再扫描一次,把这两者的低者作为{桶}的高度,如果这个桶高于A[i]的bar,那么A[i]这个bar上头可以存储height - A[i]这么多水。把这所有的水加起来即可。

     1 public class Solution {
     2     public int trap(int[] A) {
     3         if (A == null) {
     4             return 0;
     5         }
     6         
     7         int max = 0;
     8         
     9         int len = A.length;
    10         int[] left = new int[len];
    11         int[] right = new int[len];
    12         
    13         // count the highest bar from the left to the current.
    14         for (int i = 0; i < len; i++) {
    15             left[i] = i == 0 ? A[i]: Math.max(left[i - 1], A[i]);
    16         }
    17         
    18         // count the highest bar from right to current.
    19         for (int i = len - 1; i >= 0; i--) {
    20             right[i] = i == len - 1 ? A[i]: Math.max(right[i + 1], A[i]);
    21         }
    22         
    23         // count the largest water which can contain.
    24         for (int i = 0; i < len; i++) {
    25             int height = Math.min(right[i], left[i]);
    26             if (height > A[i]) {
    27                 max += height - A[i];
    28             }
    29         }
    30         
    31         return max;
    32     }
    33 }
    View Code

    2015.1.14 redo:

    合并2个for 循环,简化计算。

     1 public class Solution {
     2     public int trap(int[] A) {
     3         // 2:37
     4         if (A == null) {
     5             return 0;
     6         }
     7         
     8         int len = A.length;
     9         int[] l = new int[len];
    10         int[] r = new int[len];
    11         
    12         for (int i = 0; i < len; i++) {
    13             if (i == 0) {
    14                 l[i] = A[i];
    15             } else {
    16                 l[i] = Math.max(l[i - 1], A[i]);
    17             }
    18         }
    19         
    20         int water = 0;
    21         for (int i = len - 1; i >= 0; i--) {
    22             if (i == len - 1) {
    23                 r[i] = A[i];
    24             } else {
    25                 // but: use Math, not max
    26                 r[i] = Math.max(r[i + 1], A[i]);
    27             }
    28             
    29             water += Math.min(l[i], r[i]) - A[i];
    30         }
    31         
    32         return water;        
    33     }
    34 }
    View Code

    CODE:

    https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/array/Trap.java

  • 相关阅读:
    crontab定时任务
    find at tar命令详解
    c#调用c++dll库调用约定问题
    ATL和ActiveX做的控件.dll和.ocx最主要的区别(摘录)
    实现内外网的策略
    探查“ORA-01000:超出最多允许打开的游标数”
    良好编程习惯的重要性
    PCS不能用问题
    msf外网--->>安卓
    github 克隆代码问题
  • 原文地址:https://www.cnblogs.com/yuzhangcmu/p/4057374.html
Copyright © 2011-2022 走看看