单调栈C++详解(知识点与LeetCode题目解析)

文章介绍了单调栈的概念及其在解决LeetCode题目中的应用,如计算每日温度上升天数、寻找下一个更大元素、接雨水问题和柱状图中最大矩形的面积,展示了如何利用单调栈优化算法,降低时间复杂度。

目录

一、单调栈的定义

二、单调栈的使用

三、单调栈的LeetCode题目解析

1.每日温度 739

2.下一个更大元素 496

3.下一个更大元素 2    503

4.接雨水  42 

5.柱状图中最大的矩形 84


一、单调栈的定义

单调栈,顺序一致的栈,顾明思义就是单调递增或者单调递减的栈,那为什么要单独介绍这一数据结构呢?

因为单调栈的特性,使得它在面对“下一个元素”“不再升高减少”这类题目的时候,可以提供更优的算法解,时间复杂度也会降低。

二、单调栈的使用

单调栈,一般是需要对当前元素的左侧后右侧进行讨论

需要元素的左侧和右侧都小于当前元素时,使用单调递增栈

需要元素的左侧和右侧都大于当前元素时,使用单调递减栈

三、单调栈的LeetCode题目解析

1.每日温度 739

给定一个整数数组 ,表示每天的温度,返回一个数组 ,其中 是指对于第 天,下一个更高温度出现在几天后。 如果气温在这之后都不会升高,请在该位置用 来代替。temperaturesansweranswer[i]i0

 

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;//单调栈保存数据
        vector<int> result(temperatures.size(),0);//初始化皆为0
        st.push(0);//默认加入下标为0,第一个元素

        for(int i = 1;i<temperatures.size();i++){
            if(temperatures[i] <= temperatures[st.top()]){
                st.push(i);//将小于当前温度的都存入栈顶
            }else{
                //当前元素大于单调栈的栈顶
                while(!st.empty() && temperatures[i] > temperatures[st.top()]){
                    result[st.top()] = i-st.top();//当前更高的温度,代表几天后升温
                    st.pop();//弹出
                }
                st.push(i);//然后将自己存入,此时要么比剩下的小,要么等于
            }
        }

        return result;
    }
};

题解:

本题要求几天后才会出现比当前温度高的,那么就可以用单调栈,将数组的小的元素一个个存入,形成一个单调递增的栈。遍历目标数组的每一个值,如果当前目标数组的值,比单调栈的栈顶元素等于或小于,就存入单调栈(这样就会形成单调递增)。如果大于单调栈的栈顶元素,那么就一个个比较赋值,设置result数组,将栈顶存储的索引下的值赋值为当前的索引减去栈中存储的索引的差,就是几天后。最后记得将元素存入栈,为了进行下一次比较。初始化的时候记得大小和目标一致,因为最终是要返回数组的

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花火の云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值