739:每日温度
链接: Leetcode739.每日温度
题目需求
给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
思路
-
分析题干
a. 题目要求的是在每一天记录下一个更高温度是在几天后。这就要求首先要知道每一天的索引,其次当发现下一个更高的温度时,可以及时做出反馈【第一步】
b. 这时候用一个容器来存储每一天的温度,当下一个更高温度来临时,可以做出反馈,做出反馈后的温度无需保留。从上述描述来看,选栈是一个不错的选择【第二步】
c. 抽象化第二步的描述,那就是遍历每一天的温度时,如果当前温度小于栈顶温度,那么就入栈等待。如果当前温度大于栈顶温度时,就开始弹出,直到栈里没有比当前温度更低的元素【第三步】
d. 进一步抽象,从栈顶到栈底来看,这其实是在维护一个单调递增的序列,因此这个栈又叫单调栈【第四步】 -
写题顺序
a. 创建一个栈
b. 遍历数组,如果当前温度比栈顶温度低,则当前温度入栈;否则,开始出栈,收获结果 -
注意事项
a. 栈存的是索引,不是元素值。因为最后返回的数组其实是索引之间的差值。 -
代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
if(temperatures.size() == 1) return vector<int>{0};
stack<int> sta; // 索引
sta.push(0);
int idx = 1;
vector<int> result(temperatures.size(), 0);
while(!sta.empty() && idx < temperatures.size()){
while(!sta.empty() && temperatures[idx] > temperatures[sta.top()]){
result[sta.top()] = idx - sta.top();
sta.pop();
}
sta.push(idx);
idx++;
}
return result;
}
};
题外话
单调栈还有很多的应用,包括解决接雨水、柱状图中最大的矩形等问题,代码随想录也有专门一章进行详细讲解
参考: 代码随想录-739.每日温度