2021年04月14日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. 题目简介
2. 题解
2.1 从后往前遍历
思路:维护一个数组 t ,记录每个温度第一次出现的下标,从后往前遍历,找出大于当前元素中,索引最小的那个,就是第一个大于当前元素值的索引,同时更新数组 t 。
为什么要从后往前遍历?
答:如果从前往后遍历,前面的元素可能会影响当前位置结果的判断。而从后往前遍历,保证了当前元素前面的元素都没被访问过,所以,根据数组 t 的定义和题目要求,找出大于当前元素中索引最小的那个,就是满足要求的结果。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int n = T.size();
// 初始值设为无穷大
vector<int> t(101,INT_MAX);
vector<int> res(n,0);
// 从后往前遍历(为什么不从前往后呢?)
for(int i=n-1;i>=0;--i){
int minIdx = INT_MAX;
for(int j=T[i]+1;j<=100;++j){
minIdx = min(minIdx,t[j]);
}
if(minIdx!=INT_MAX){
res[i] = minIdx-i;
}
t[T[i]] = i;
}
return res;
}
};
2.2 单调栈
思路:维护一个单调递减的栈,栈内存放数组元素的索引,遇到大于栈顶元素的索引,就弹出栈顶元素,并计算对应索引的结果。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int n = T.size();
stack<int> stk;
vector<int> res(n,0);
for(int i=0;i<n;++i){
while(!stk.empty() && T[i]>T[stk.top()]){
res[stk.top()] = i - stk.top();
stk.pop();
}
stk.push(i);
}
return res;
}
};
参考文献
https://leetcode-cn.com/problems/daily-temperatures/solution/mei-ri-wen-du-by-leetcode-solution/