Given a list of daily temperatures, produce a list that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.
For example, given the list temperatures = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].
Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100].
原文:https://leetcode.com/problems/daily-temperatures/description/
题中给定个数组,数组中存放的是天气的气温,然后需要让我们求出数组中当前元素在第几天后会进行升温,比如第一天是73°,在1天之后就会升温到74°。
在遇到这种需要计算当前的元素和之后的元素,需要思考是从前向后遍历好还是从后向前遍历好。
拿第一天和第二天来做例子,
如果是从前向后遍历的话,先遍历第一天,我们需要记录下载第一天的温度,然后遍历到第二天,需要用第二天的温度和第一天左比较,发现第二天比第一天温度高,所以又要返回去修改第一天的结果,将其设置为1。
如果是从后向前遍历的话,先遍历第二天,我们需要记录下第二天的温度,然后遍历到第一天,需要用第一天和第二天的温度作比较,发现第一天的气温比第二天的低,此时我们可以直接修改第一天(也就是当前遍历的位置)的结果,将其设置为1。
所以从分析来看,从后向前遍历比较好一点,因为两者都是需要记录下一系列信息,但是从前向后遍历的话还需要返回去进行修改结果,但是从后向前遍历的话只需要修改当前的结果即可。
所以我们需要从后向前遍历,然后用一个栈来记录遍历过的气温是第几天的,对比当前的位置上的气温和栈顶的气温,如果当前气温比栈顶气温高,则执行出栈操作,直到遇到栈中的气温比当前的温度高,则说明在栈顶所在的天数会升温,然后用栈顶减去当前的天数(因为是从后向前遍历,所以栈中的天数要比当前的大)则能够求出在当前温度之后还有多少天会升温。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> ans(temperatures.size());
stack<int> stk;// 用来保存之前的气温是第几天的
// 从尾到头遍历
for(int i=temperatures.size()-1;i>=0;i--) {
while(!stk.empty() && temperatures[i] >= temperatures[stk.top()])// 如果当前的气温比栈中的气温高,则出栈
stk.pop();
// 如果栈中为空,则说明后面的天气没有比现在高的,放入0,
// 如果不为空则说明后面的天气存在比现在高的,则查看上个比之前高的天气是第几天的。
ans[i] = stk.empty() ? 0 : stk.top() - i ;
stk.push(i);
}
return ans;
}
};