zoukankan      html  css  js  c++  java
  • LeetCode 42. 接雨水(Trapping Rain Water)

    题目描述

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

    示例:

    输入: [0,1,0,2,1,0,1,3,2,1,2,1]
    输出: 6

    解题思路

    基本思想是从数组首位置找到第一个大于其紧邻后面的数,将它作为第一个雨槽的左挡板,然后向后遍历找到第一个不小于它的的数作为右挡板,这两个高度之间即可构成一个容器,遍历中间的高度依次计算盛水单位,然后继续以此右挡板作为下一个雨槽的左挡板。如果没有找到不小于左挡板的高度,则把此段雨槽反过来重新按照之前的算法计算盛水容量。

    代码

     1 class Solution {
     2 public:
     3     int trap(vector<int>& height) {
     4         int res = 0;
     5         if(height.size() < 3) return res;
     6         int left = 0;
     7         while(left < height.size() - 1 && height[left] <= height[left + 1])
     8             left++;
     9         if(left == height.size() - 1) return res;
    10         int right = left + 1;
    11         while(right < height.size()){
    12             if(height[right] >= height[left]){
    13                 for(int i = left + 1; i < right; i++)
    14                     res += height[left] - height[i];
    15                 left = right;
    16                 right = left + 1;
    17             }
    18             else if(right == height.size() - 1){
    19                 vector<int> hr;
    20                 for(int i = right; i >= left; i--)
    21                     hr.push_back(height[i]);
    22                 res += trap(hr);
    23                 break;
    24             }
    25             else right++;
    26         }
    27         return res;
    28     }
    29 };
  • 相关阅读:
    Windows下Rails2.0.2最简安装教程
    xmpp with openfire之三 openfire扩展小试 整合现有系统用户
    母亲的电话
    郁闷……
    博弈
    长春下雪了
    监考
    sql把逗号分隔的字符串拆成临时表
    SQL语句使用大全。
    Left Join、Right Join、Inner Join的区别
  • 原文地址:https://www.cnblogs.com/wmx24/p/9556890.html
Copyright © 2011-2022 走看看