Given a list of daily temperatures T
, return a list such 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 of temperatures T = [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]
.
题意:给出一个数组,对于数组中的每个元素,计算其右边第一个比它大的元素与它的位置之差。
方法一:维护一个栈,栈中记录的是位置信息,表示该位置对应的数组元素还未找到下一个比其大的元素。当栈不为空或者栈顶元素所表示的位置处元素值小于当前遍历的数组元素时,表示栈顶元素找到其下一个较大值,退栈并记录。每次遍历不要忘记将当前位置入栈。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
stack<int>st;
vector<int>vec(T.size(),0);
for(int i=0;i<T.size();i++){
while(!st.empty()&&(T[st.top()]<T[i])){
vec[st.top()]=i-st.top();
st.pop();
}
st.push(i);
}
return vec;
}
};
方法二:从后向前遍历数组,vec[i]记录第i位置处元素与下一个大于它的元素的位置之差,则有[i+1,i+vec[i]]位置处的元素均不大于i位置元素。对每一元素T[i],若其后面相邻元素T[j]大于它,则距离差为1;否则有[j,j+vec[j]]区间内元素必均不大于T[i],我们直接从T[j+vec[j]]再开始比较即可。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int>vec(T.size(),0);
for(int i=T.size()-1;i>=0;i--){
int j=i+1;
while(j<T.size()&&T[i]>=T[j]){
if(vec[j]>0)
j+=vec[j];
else
j=T.size();
}
if(j<T.size())
vec[i]=j-i;
}
return vec;
}
};