本博客我们梳理一下单调栈相关知识和题目。
一、单调栈基本介绍
单调栈适合解决求当前元素左边或右边第一个比当前元素大或者小的元素,找到这个元素可以找到数值或者对应下标,然后进行其他运算。这个方法可以提供时间复杂度上的优化。我们需要自己用栈模拟单调栈。
二、每日温度
这是一个很直接简单的可以用单调栈解决的问题,题目为739. 每日温度 - 力扣(LeetCode),给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
我们需要使用单调栈记录遍历过的元素的下标,栈里需要存放的是一个递减的序列,此处的递减为我自己定义的,意思为每次出栈的下标对应的元素都是栈内最小的。因为我们需要记录的是每个天气后比自己气温高的天气,所以如果遍历到比栈顶对应的元素大的值,需要让栈顶出栈并在栈顶下标除记录几天后能遇到比自己气温高的。
代码如下:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> stk;
vector<int> ret(temperatures.size(), 0);
for(int i = 0; i<temperatures.size(); i++)
{
if(stk.empty()==1 || temperatures[stk.top()]>=temperatures[i])
{
stk.push(i);
}
else
{
while(stk.empty()!=1 && temperatures[stk.top()]<temperatures[i])
{
ret[stk.top()] = i-stk.top();
stk.pop();
}
stk.push(i);
}
}
return ret;
}
};