题目描述
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
单调栈
首先先来回顾一下单调栈,单调栈一般分为单调递增栈和单调递减栈,一听这名字就知道,在单调栈中,所有元素都按一定递增或递减顺序排列。单调递增栈的一个应用就是可以找到数组中任意元素左侧第一个比当前数字小的元素。
假设有一个数组 [3,1,5,8,7],刚开始3入栈,当数字1入栈的时候,发现栈顶元素3比较大,于是将3移出栈,1入栈。那么由于3和1在栈底,所以它们左侧都没有比自身小的数字。然后数字5入栈的时候,栈顶元素1小于5,于是5直接入栈,那么1就是5左侧第一个比它小的数字。此时栈里有1和5,然后数字8继续入栈,于是5就是8左侧第一个小的数字。此时栈里有1,5,8,最后数字7入栈的时候,栈顶元素8大于7,需要将8移除,此时新的栈顶元素5小于7,那么7就可以入栈了,最终栈内数字即为 1,5,7。
算法思路
这道题目理解起来非常很简单,就是要找到每个元素后面第一个比该元素大的元素,并返回两个元素的下标之差。如果没有找到比该元素更大的值,就返回0。于是我们建立一个大小与温度数组相同的返回数组,并将所有元素初始化为0。接下就运用单调栈,当栈不为空且遍历元素大于栈顶元素时,弹出栈顶元素,并记录下标差值。
C ++代码
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> index;
vector<int> res(T.size());
for(int i = 0; i < T.size(); i++) {
while (!index.empty() && T[i] > T[index.top()] ) {
int j = index.top();
index.pop();
res[j] = i - j;
}
index.push(i);
}
return res;
}
};