目录
一、单调栈的定义
单调栈,顺序一致的栈,顾明思义就是单调递增或者单调递减的栈,那为什么要单独介绍这一数据结构呢?
因为单调栈的特性,使得它在面对“下一个元素”“不再升高减少”这类题目的时候,可以提供更优的算法解,时间复杂度也会降低。
二、单调栈的使用
单调栈,一般是需要对当前元素的左侧后右侧进行讨论
需要元素的左侧和右侧都小于当前元素时,使用单调递增栈
需要元素的左侧和右侧都大于当前元素时,使用单调递减栈
三、单调栈的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数组,将栈顶存储的索引下的值赋值为当前的索引减去栈中存储的索引的差,就是几天后。最后记得将元素存入栈,为了进行下一次比较。初始化的时候记得大小和目标一致,因为最终是要返回数组的

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





