LeetCode42.接雨水(单调栈)

题目

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

示例 :

c 复制代码
输入: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 个单位的雨水(蓝色部分表示雨水)。 

思路:

从题目中我们可以知道:只有凹陷的地方才可以存储雨水,那么高度一定是先减后增,所以当我们遍历到增这个位置时,前面减的地方(即凹陷的地方)一定会存储雨水,这时我们将凹陷处出栈就可以计算它能存储的雨水量了。

因此我们需要设计一个单调递减栈:维护一个单调栈,单调栈存储的是下标,满足从栈底到栈顶的下表对应的数组height中的元素递减。栈顶的元素就是凹槽的最低点

此外单调栈还有一个需要注意的地方:弹出栈顶后判断栈是否为空,因为当栈为空时,说明左边不存在最大值,无法存储雨水。

Code:

c 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size() <= 1)
        {
            return 0;
        }
        stack<int>st;
        int sum=0;
        st.push(0);
        for(int i=1 ; i < height.size() ; i++)
        {
            while(!st.empty() && height[i] > height[st.top()])
            {
                int vis = st.top();
                st.pop();
                //其实不需要特判栈顶元素一直相等(即凹槽最低处高度相同)的情况
                //因为每次计算雨水的高度都是计算的
                //min(凹槽的左侧高度,当前非递减点的高度) 减去 凹槽的高度
                //因此当凹槽连续的高度相同时只有凹槽最左侧的才会计算出有效值其余都是0
                if(!st.empty())
                {
                    int l = i - st.top() -1;
                    int h = min(height[i] , height[st.top()]) - height[vis];
                    sum += l*h;
                }
            }
            st.push(i);
        }
        return sum;
    }
};
相关推荐
持力行3 小时前
从C struct到C++中的class
c语言·c++
youtootech5 小时前
HarmonyOS《柚兔学伴》项目实战09-待办列表 UI——List+ForEach+滑动删除
数据结构·ui·华为·list·harmonyos
:-)6 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
GIS阵地6 小时前
QgsRasterDataProvider 完整详解(QGIS 3.40.13 C++)
开发语言·c++·qt·开源软件·qgis
charlie1145141919 小时前
Cinux: 为大内核铺路
开发语言·c++·操作系统·现代c++
Jerry9 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发11 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星11 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮11 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
肖爱Kun11 小时前
C++设计策略模式
开发语言·c++·策略模式