方法一:暴力法
遍历数组,对于每个数再向后遍历寻找比它大的数。
时间复杂度:O(n^2)
个别算例超出时间限制。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> res(T.size());
for(int i=0;i<T.size();i++){
for(int j=i+1;j<T.size();j++){
if(T[j]>T[i]){
res[i]=j-i;
break;
}
}
}
return res;
}
};
解法二:单调栈
时间复杂度:O(n)
栈中存储的是数组下标。单调递增栈。
栈中剩余元素位置没有更新,初始化时设为0。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> res(T.size());
stack<int> st;
for(int i=0;i<T.size();i++){
while(!st.empty() && T[i]>T[st.top()]){ //递增栈
int pre=st.top(); //更新栈中元素结果
res[pre]=i-pre;
st.pop();
}
st.push(i);
}
return res;
}
};
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> res(T.size(),0);
stack<int> st; //单调递减栈,只有比栈顶值小才可以入栈
for(int i=T.size()-1;i>=0;i--){ //逆序遍历
while(!st.empty() && T[i]>=T[st.top()]) //栈中不大于当前值的出栈
st.pop();
if(!st.empty()) //如果当前值比栈顶元素小可以计算下标差值
res[i]=st.top()-i;
st.push(i); //经过前面出栈,i比栈顶小可以入栈
}
return res;
}
};