力扣算法刷题Day 49(接雨水)

42 接雨水

题目链接

添加链接描述

思路

首先可以看到,对于一个位置水的高度,取决于右边第一个不小于它的高度的柱子。通过单调栈可以轻松找出右边第一个大于等于自身的柱子。

如何计算水的容量?按高度计算,对于一个池的而言,每一处位置的水的高度 = min(左,右)- 柱子高度,最后相加就是该处池子的水容量。

问题:按列计算难以判断池子的左边界。有多种情况:左边比右边小;当前左边比右边小,但更左边有更大的;以及递减之类。按列会比较难受。因此改用按行计算。

将计算逻辑变动一下即可:当遍历元素大于栈顶元素(递减栈)时,形成凹槽,分别计算凹槽的长和宽,相乘。

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int trap(vector<int>& height) {
        int sum = 0;
        if(height.size() <= 2){
            return sum;
        }
        stack<int> st;
        st.push(0);
        for(int i = 1; i < height.size(); i++)
        {
            if(height[i] < height[st.top()]){
                st.push(i);
            }else if(height[i] == height[st.top()]){
                st.pop();
                st.push(i); //保留右边的
            }else {
                while(!st.empty() && height[st.top()] < height[i]){  //
                    int mid = st.top();
                    st.pop();
                    if(!st.empty()){
                        int h = min(height[i],height[st.top()]) - height[mid];
                        int w = i - st.top() - 1; //注意减一
                        sum += h * w;
                    }
                }
                st.push(i);
            }
        }
        return sum;
    }
};

84 柱状图最大矩形

题目链接

添加链接描述

思路

与接雨水相反,这里要变成右边第一个小于它的,递增栈

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        st.push(0);
        int result = 0;
        for (int i = 1; i < heights.size(); i++) {
            while (heights[i] < heights[st.top()]) {
                int mid = st.top();
                st.pop();
                int w = i - st.top() - 1;
                int h = heights[mid];
                result = max(result, w * h);
            }
            st.push(i);
        }
        return result;
    }
};
相关推荐
6Hzlia8 分钟前
【Classic 150 刷题计划】 LeetCode 209. 长度最小的子数组 | C++ 滑动窗口(毛毛虫算法)经典模板
c++·算法·leetcode
天真小巫15 分钟前
2026.9.14总结
职场和发展
6Hzlia22 分钟前
【Classic 150 刷题计划】 LeetCode 28. 找出字符串中第一个匹配项的下标 | C++ 滑动窗口与子串比对
c++·算法·leetcode
GreenTea9 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20029 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
土司大王10 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹10 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王10 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考11 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
小哈里13 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程