• 42. 接雨水


    42. 接雨水

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

    示例 1:

    输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
    输出:6
    解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 
    

    示例 2:

    输入:height = [4,2,0,3,2,5]
    输出:9
    

    提示:

    • n == height.length
    • 1 <= n <= 2 * 104
    • 0 <= height[i] <= 105

    解析:

    1、按行计算

    对于第i行,遍历height,遇到高度大于等于i的,则结果变量sum += 累计变量temp,并且temp = 0

    遇到高度小于i的,则temp += 1

    注意当然每次要从第一个大于等于i的height开始算  时间复杂度O(mn),空间复杂度O(1)

    2、按列计算

    对于每列,求左右两边最高的height,如果两边最高的height都大于该列的height,则该列形成凹陷,可以储水

    该列的储水容量 = 左右两边最高的height中小的那一个 - 该列的height

    注意每次只看一列  时间复杂度O(n)  空间复杂度O(n)

    class Solution {
    public:
        int trap(vector<int>& height) {
            int maxh = 0;
            vector<int> lefth, righth;
            for(int i = 0; i < height.size(); i++)
            {
                lefth.push_back(maxh);
                maxh = max(maxh, height[i]);
            }
            maxh = 0;
            for(int i = height.size() - 1; i >= 0; i--)
            {
                righth.push_back(maxh);
                maxh = max(maxh, height[i]);
            }
            int sum = 0;
            for(int i = 0; i < height.size(); i++)
            {
                if(lefth[i] > height[i] && righth[height.size() - 1 - i] > height[i])
                {
                    sum += min(lefth[i], righth[height.size() - 1 - i]) - height[i];
                }
            }
            return sum;
        }
    };

    3.单调栈

    维持一个单调递减栈即可

  • 相关阅读:
    状压DP入门
    二分图匹配(最大匹配:匈牙利算法)
    序列自动机入门
    Trie树入门+例题(字典树,前缀树)
    扩展KMP算法(Z-Algorithm)
    Oracle锁表查询和解锁方法
    oracle获取系统日期--当前时间+前一天+当前月+前一个月
    oracle获取年月日,两个日期相减
    oracle decode函数和 sign函数
    expdp、impdp数据泵导出导入数据
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16689229.html
Copyright © 2020-2023  润新知