Given a list of daily temperatures
, produce a list 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 temperatures = [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]
.
思路:
1.遍历每一个数,然后向后查找(超时);
2.利用一个stack进行维护,获得一个新的数,比较其与stack.top()的大小,若大,pop出top的数,计算两个位置差存入,再与下一个比较,若小,直接压入stack
代码1:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector< int > ans ;
if( temperatures.size() == 0 )
return ans ;
deque< int > dlist;
deque< int > index ;
ans.resize( temperatures.size() , 0 ) ;
for( int i=0 ; i<temperatures.size() ; i++){
if( dlist.size() == 0 ){
dlist.push_back( temperatures[i] ) ;
index.push_back( i );
}
else{
if( temperatures[i] <= dlist.back() ){
dlist.push_back( temperatures[i] ) ;
index.push_back( i ) ;
}
else{
while( dlist.size() && dlist.back() < temperatures[i]) {
int target = index.back() ;
ans[target] = i - index.back() ;
index.pop_back() ;
dlist.pop_back() ;
}
dlist.push_back(temperatures[i]);
index.push_back( i ) ;
}
}
}
return ans ;
}
};
代码2:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& t) {
vector<int> res(t.size(),0);
stack<pair<int,int>> s;
for(int i=0;i<t.size();i++){
pair<int,int> temp1(t[i],i);
if(s.size()!=0){
while(s.size()!=0){
pair<int,int> temp2=s.top();
if(temp2.first<temp1.first){
res[temp2.second]=temp1.second-temp2.second;
s.pop();
}
else{break;}
}
}
s.push(temp1);
}
return res;
}
};
代码3:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temps) {
int n = temps.size();
vector<int> waits(n, 0);
vector<int> next(101, INT_MAX); // next day with with certain temperature.
for (int i = n - 1; i >= 0; i--) {
int earliest = INT_MAX;
for (int t = temps[i] + 1; t <= 100; t++) {
earliest = min(earliest, next[t]);
}
if (earliest != INT_MAX) waits[i] = earliest - i;
next[temps[i]] = i;
}
return waits;
}
};