其他分享
首页 > 其他分享> > 42. 接雨水

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

 

提示:

 

解析:

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.单调栈

维持一个单调递减栈即可

 

 

标签:int,复杂度,42,雨水,height,maxh,该列,size
来源: https://www.cnblogs.com/WTSRUVF/p/16689229.html