力扣算法刷题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;
    }
};
相关推荐
探物 AI2 小时前
【感知实战·数据增强篇】深度解析目标检测中的图片数据增强算法,多图演示效果
人工智能·算法·目标检测
Evand J2 小时前
【MATLAB代码介绍】三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波,目标高精度、自适应跟踪定位
开发语言·算法·matlab·imm·代码介绍
ZC跨境爬虫2 小时前
3D 地球卫星轨道可视化平台开发 Day12(解决初始相位拥挤问题,实现卫星均匀散开渲染)
前端·javascript·算法·3d·json
子午2 小时前
蔬菜识别~Python+深度学习+卷积网络算法+图像识别+2026原创+蔬菜识别
python·深度学习·算法
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 155. 最小栈 | C++ 打包状态法 (最优雅的 O(1) 检索)
java·c++·leetcode
子午2 小时前
文本情感识别系统~Python+textCNN算法+深度学习+人工智能
人工智能·python·算法
pearlthriving2 小时前
STL容器及其底层
开发语言·c++·算法
念越2 小时前
算法每日一题 Day04|快慢双指针法解决环形链表问题
数据结构·算法·链表
张人玉2 小时前
VisionPro 药物检测工具 学习笔记
算法·c#·机器视觉·vsionpro