题目 :
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
分析:
返回的是当天温度后第一次温度上升的天数;
题解1(暴力求解--->双循环)
代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int len = temperatures.size();
vector<int> ans(len,0);
for(int i = 0 ; i <len ;++i){
for(int j = i+1;j<len;++j){
if(temperatures[j]>temperatures[i]){
ans[i] = j-i;
break;
}
}
}
return ans;
}
};
题解2 (暴力 回退)
对于温度列表中的每个元素 temperatures[i],需要找到最小的下标 j,使得 i < j 且 temperatures[i] < temperatures[j]。
由于温度范围在 [30, 100] 之内,因此可以维护一个数组 next 记录每个温度第一次出现的下标。数组 next 中的元素初始化为无穷大,在遍历温度列表的过程中更新 next 的值。
代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int len = temperatures.size();
vector<int> ans(len),next(101,INT_MAX);
for(int i = len-1 ; i>=0 ;--i){
int tmp = INT_MAX;
for(int t = temperatures[i]+1;t<=100;++t){
tmp = min(tmp,next[t]);
}
if(tmp!=INT_MAX){
ans[i]=tmp-i;
}
next[temperatures[i]]=i;
}
return ans;
}
};
题解三,单调栈
代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int len = temperatures.size();
vector<int> ans(len);
stack<int> s;
for(int i = 0; i<len;++i){
while(!s.empty()&&temperatures[i]>temperatures[s.top()]){
int previousIndex = s.top();
ans[previousIndex] = i-previousIndex;
s.pop();
}
s.push(i);
}
return ans;
}
};