单调栈Day36:接雨水

42. 接雨水

利用单调栈先找到左侧第一个大于当前高度的,再用栈的单调特性,弹出的下一个一定大于当前的

就找到了左右的支柱,左右最短的减去当前块高度为h,下标差为w,相乘即为当前块能盛水的面积

cpp 复制代码
    int trap(vector<int>& height) {
        if(height.size() == 0){
            return 0;
        }
        int sum = 0;
        stack<int> st;
        st.push(0);
        for(int i = 1; i < height.size(); i++){
            if(height[i] > height[st.top()]){
                while(!st.empty() && height[i] > height[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        int width = i - st.top() - 1;
                        int h = min(height[i], height[st.top()]) - height[mid];
                        sum += width * h;
                    }
                }
            }
            st.push(i);
        }
        return sum;
    }

84. 柱状图中最大的矩形

单调栈(区别接雨水的栈),找每个柱的「左右第一个更矮柱」,中间部分就是能容纳高度为height[mid]的矩形,宽度就为两侧矮柱横坐标之差

首尾插 0 是关键技巧,避免栈空 / 边界漏算;

核心计算:弹出柱为高,左右边界间距为宽,取面积最大值。

cpp 复制代码
    int largestRectangleArea(vector<int>& heights) {
        if(heights.size() == 0){
            return 0;
        }
        stack<int> st;
        //首尾插入0
        heights.insert(heights.begin(), 0);
        heights.push_back(0);

        st.push(0);
        int res = 0;
        for(int i = 1; i < heights.size(); i++){
            if(heights[i] < heights[st.top()]){
                while(!st.empty() && heights[i] < heights[st.top()]){
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()) {
                        int h = heights[mid];
                        int w = i - st.top() - 1;
                        res = max(res, h*w);
                    }
                }
            }
            st.push(i);
        }
        return res;
    }
相关推荐
2301_7890156213 分钟前
DS进阶:AVL树
开发语言·数据结构·c++·算法
qyzm3 小时前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
逆境不可逃4 小时前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
CoderCodingNo4 小时前
【GESP】C++五级练习题 luogu-P1182 数列分段 Section II
开发语言·c++·算法
放下华子我只抽RuiKe54 小时前
机器学习全景指南-直觉篇——基于距离的 K-近邻 (KNN) 算法
人工智能·gpt·算法·机器学习·语言模型·chatgpt·ai编程
kisshuan123964 小时前
[特殊字符]【深度学习】DA3METRIC-LARGE单目深度估计算法详解
人工智能·深度学习·算法
sali-tec4 小时前
C# 基于OpenCv的视觉工作流-章33-Blod分析
图像处理·人工智能·opencv·算法·计算机视觉
Eward-an5 小时前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode
一叶落4385 小时前
LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)
c语言·算法·leetcode
皙然6 小时前
彻底吃透红黑树
数据结构·算法