Leetcode.0739 | 每日温度
题目
请根据每日 气温 列表 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的成员函数
() 堆栈为空则返回真
() 移除栈顶元素
() 在栈顶增加元素
() 返回栈中元素数目
() 返回栈顶元素