题目
给定一个整数数组 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
解题思路
第一想法是建两个栈,一个栈存每天的温度另一个数存下标,再用一个动态数组来存答案,
两个栈同步进行出栈和进栈操作,因此只需要维护一个存温度的单调递减栈就可以了,当将要进栈的元素大于栈顶元素时,就用当前下标减去存下标栈的栈顶值,并存入数组中,
代码实现
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int>a;
stack<int>b;
vector<int>c(temperatures.size());
if(!temperatures.size())return c;
for(int i=0;i<temperatures.size();i++){
if(a.empty()){
a.push(temperatures[i]);
b.push(i);
}else{
if(temperatures[i]<=a.top()){
a.push(temperatures[i]);
b.push(i);
}else{
while(!a.empty()){
if(a.top()<temperatures[i]){
c[b.top()]=i-b.top();
a.pop();
b.pop();
}else{
a.push(temperatures[i]);
b.push(i);
break;
}
}
if(a.empty()){
a.push(temperatures[i]);
b.push(i);
}
}
}
}
return c;
}
};
官方题解
更加优化一个栈就可以了
代码实现
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int>ans(temperatures.size());
stack<int>a;
for(int i=0;i<temperatures.size();i++){
if(a.empty())a.push(i);
else{
while(!a.empty()){
if(temperatures[i]>temperatures[a.top()]){
ans[a.top()]=i-a.top();
a.pop();
}else{
break;
}
}
a.push(i);
}
}
return ans;
}
};