题目
请根据每日 气温
列表 temperatures
,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0
来代替。
示例
输入: temperatures = [73,74,75,71,69,72,76,73] 输出: [1,1,4,2,1,1,0,0]
输入: temperatures = [30,40,50,60] 输出: [1,1,1,0]
输入: temperatures = [30,60,90] 输出: [1,1,0]
解决方法
维护一个递减栈,要求栈中后入栈的元素总比栈顶元素小。栈中的数据为气温列表T的索引序号。
从左到右遍历气温列表T中的元素。如果栈为空,则将遍历到的元素的序号放入栈中。如果遍历到的元素的温度值小于栈顶元素的温度值,则将遍历到的元素的序号入栈。如果遍历到的元素的温度值大于栈顶元素的温度值,则挨个弹出栈中的元素,直到栈中的栈顶元素的温度值比遍历到的元素的温度值大,再把这个遍历到的元素的序号放回栈中。
关于结果数组中的数据。当遍历到的元素的温度值大于栈顶元素的温度值,假设遍历到的元素的序号为i,栈顶元素的序号为t,那么对于栈顶元素来说,还需要有i-t天会有比栈顶元素温度更高的温度。
代码实现
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int> data;
vector<int> res(T.size(),0);
for(int i = 0;i < T.size();i ++){
if(data.empty()){
data.push(i);
}
if(T[data.top()] < T[i]){
while(!data.empty() && T[data.top()]<T[i]){
res[data.top()] = i - data.top();
data.pop();
}
}
if(data.empty() || T[data.top()] >= T[i]){
data.push(i);
}
}
return res;
}
};
补充知识
C++中stack的成员函数
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素