【题目链接】
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
?如果采用最简单最暴力的方法,就是从当前位置i的下一个位置i+1出发,找到第一个j,使得temperatures[j] > temperatures[i],这种方法最坏情况得时间复杂度为O(n^2)。那么,有没有更好得方法呢?答案是有的。
?采用单调栈的方法,维护一个从栈底到栈顶单调递减的序列,举个简单的例子,例如温度序列为【1,4,3,5,5,2,3,6】
?同样,我们也可以维护一个从栈底到栈顶维护一个单调递减的序列,遍历的序列从右往左。
单调栈的基本思想——及时去掉无用的数据,保证栈中数据有序
vector<int> solve1(vector<int> &temperatures)
{
int n = temperatures.size();
vector<int> res(n,0);
stack<int> st;
for(int i =0;i<n;++i)
{
int t = temperatures[i];
while(!st.empty() && t> temperatures[st.top()])
{
res[st.top()] = i-st.top();
st.pop() ;
}
st.push(i);
}
return res;
}
vector<int> solve(vector<int> &temperatures)
{
int n = temperatures.size();
vector<int> res(n,0);
stack<int> st;
for(int i =n-1;i>=0;i--)
{
int t = temperatures[i];
while(!st.empty() && t>=temperatures[st.top()])
{
st.pop();
}
if(!st.empty())
{
res[i] = st.top()-i;
}
st.push(i);
}
return res;
}