zoukankan      html  css  js  c++  java
  • 42. 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.


    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!

    Example:

    Input: [0,1,0,2,1,0,1,3,2,1,2,1]
    Output: 6

     1 class Solution {
     2     public int count(int l, int r, int[]height) {
     3         int min = Math.min(height[l], height[r]);
     4         int sum = 0;
     5         for (int i = l + 1; i < r; ++i)  sum += Math.min(height[i], min);
     6         return min * (r - l - 1) - sum;
     7         
     8     }
     9     public int trap(int[] height) {
    10         int n = height.length;
    11         int [][]stack = new int[n][2];
    12         int k = 0;
    13         if (n == 0 || n == 1) return 0;
    14         
    15         int i = 0;
    16         int ans = 0;
    17         while (i < n && height[i] == 0) i++;
    18         if (i == n) return 0;
    19         stack[k][0] = i++;
    20         stack[k++][1] = 0;
    21         
    22         if (i == n) return 0;
    23         int temp = 0;
    24         while (i < n) {
    25             if (height[i] <= height[stack[k - 1][0]]) {
    26                 stack[k][0] = i;
    27                 
    28                 stack[k][1] = stack[k - 1][1];
    29                 k++;
    30             
    31                 
    32             } else {
    33                 
    34                 while (k - 1 >= 0 && height[i] >= height[stack[k - 1][0]]) {
    35                     k--;
    36                     
    37                 }
    38                 if (k == 0) {
    39                     ans += count(stack[0][0], i, height);
    40                     stack[k][0] = i;
    41                     stack[k++][1] = 0;
    42                     temp = 0;
    43                 } else {
    44                     
    45                     int temp1 = count(stack[k - 1][0], i, height);
    46                     
    47                     temp = temp1 + stack[k - 1][1] ;
    48                    
    49                     stack[k][0] = i;
    50                     stack[k++][1] = temp;
    51                 }
    52             }
    53             i++;
    54         }
    55         
    56         return ans +  temp;
    57     }
    58 }
  • 相关阅读:
    Nginx log日志参数详解
    sea.js模块加载工具
    sea.js模块加载工具
    Airbnb React/JSX 编码规范
    4.2 react patterns(转)
    4.1 react 代码规范
    3.5 compose redux sages
    3.3 理解 Redux 中间件(转)
    3.4 redux 异步
    3.1 开始使用 redux
  • 原文地址:https://www.cnblogs.com/hyxsolitude/p/12322933.html
Copyright © 2011-2022 走看看