力扣算法刷题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;
    }
};
相关推荐
大鱼>27 分钟前
宠物行为识别AI算法详解:从数据采集到模型部署的完整方案
人工智能·深度学习·算法·宠物
王莎莎-MinerU31 分钟前
解析回归集:RAG 和 Agent 上线前,先把表格、公式、版面测清楚
人工智能·算法·数据挖掘·回归·pdf·ocr
KaMeidebaby36 分钟前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
AndrewHZ38 分钟前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
AI科技星2 小时前
基于全域数学公理体系求解三元约束极值题【乖乖数学】
人工智能·算法·机器学习·密码学·拓扑学·乖乖数学·全域数学
伊玛目的门徒9 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry10 小时前
LeetCode 226. 翻转二叉树
算法
想做小南娘,发现自己是女生喵11 小时前
【无标题】
数据结构·算法
Kx_Triumphs12 小时前
HDU4348 To the moon(主席树区间修改模板)
算法·题解