每日温度
请根据每日气温列表 temperatures
,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0
来代替。
示例:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
思路
解法一:
本题的本质也是求第一个更大的元素。使用单调栈求解,找到更大的数出栈,所以该栈为单调递减栈(从栈底到栈顶)。
由于单调栈满足从栈底到栈顶元素对应的温度递减,因此每次有元素进栈时,会将温度更低的元素全部移除,并更新出栈元素对应的等待天数,这样可以确保等待天数一定是最小的。
结果需要存储下标差值,所以将下标入栈。
当栈不为空和大于栈顶元素时,计算下标差值,并出栈,否则入栈。
#include <iostream>
class Solution
{
public:
vector<int> dailyTemperatures(vector<int> &temperatures)
{
int n = temperatures.size();
stack<int> stk;
vector<int> res(n);
for (int i = 0; i < n; i++)
{
while (!stk.empty() && temperatures[i] > temperatures[stk.top()]) // 找到更大的元素
{
int index = stk.top();
res[index] = i - index; //存储下标差值
stk.pop();
}
stk.push(i);
}
return res;
}
};