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!

    仔细想想感觉这道题应该是扫一遍就能得到结果的。。。对某个值A[i]来说,能trapped的最多的water取决于在i之前最高的值leftMostHeight[i]和在i右边的最高的值rightMostHeight[i](均不包含自身)。如果min(left,right) > A[i],那么在i这个位置上能trapped的water就是min(left,right) – A[i]。有了这个想法就好办了,第一遍从左到右计算数组leftMostHeight,第二遍从右到左计算rightMostHeight。时间复杂度是O(n)。

     1 class Solution {
     2 public:
     3     int trap(int A[], int n) {
     4         int maxHeight = 0;
     5         vector<int> leftMostHeight(n, 0);
     6         for (int i = 0; i < n; ++i) {
     7             leftMostHeight[i] = maxHeight;
     8             maxHeight = (maxHeight > A[i]) ? maxHeight : A[i];
     9         }
    10         maxHeight = 0;
    11         vector<int> rightMostHeight(n, 0);
    12         for (int i = n - 1; i >= 0; --i) {
    13             rightMostHeight[i] = maxHeight;
    14             maxHeight = (maxHeight > A[i]) ? maxHeight : A[i];
    15         }
    16         int water = 0, height;
    17         for (int i = 0; i < n; ++i) {
    18             height = min(leftMostHeight[i], rightMostHeight[i]) - A[i];
    19             water += (height > 0) ? height: 0;
    20         }
    21         return water;
    22     }
    23 };

     下面是扫一遍的代码:

     1 class Solution {
     2 public:
     3     int trap(int A[], int n) {
     4         int left = 0, right = n - 1;
     5         int height = 0, res = 0;
     6         while (left < right) {
     7             if (A[left] < A[right]) {
     8                 height = max(height, A[left]);
     9                 res += height - A[left];
    10                 ++left;
    11             } else {
    12                 height = max(height, A[right]);
    13                 res += height - A[right];
    14                 --right;
    15             }
    16         }
    17         return res;
    18     }
    19 };
  • 相关阅读:
    while 循环 。。
    数据运算,运算符
    字符串常用操作
    列表常用操作
    三级菜单
    杂七杂八
    简单的登陆程序001
    猜年龄游戏
    实现密文输入密码
    使用urllib2打开网页的三种方法
  • 原文地址:https://www.cnblogs.com/easonliu/p/3656316.html
Copyright © 2011-2022 走看看