一. 這題求的是第一個升高的溫度並計算天數, 正常思路是當前溫度和後面所有溫度進行比較,時間複雜度O(n^2).
二. 因此我們考慮維護一個單調遞減棧.當前數字如果大於棧頂元素, 就不是單調棧, 且這也是第一個我們需要計算的天數,因此計算天數後 , 棧頂出棧, 當前數入棧, 並重復, 時間複雜度 O(n). 因爲每個數字最多壓入和彈出堆棧一次.
// 單調遞減棧
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int len = T.size();
vector<int> res(len,0);
stack<int> st;
if(len==1) return res;
for(int i=0;i<len;i++) {
//棧不爲空且當前元素不滿足單調遞減,
//反覆執行,計算天數,直到滿足單調棧爲止.
while (!st.empty() && T[i]>T[st.top()]) {
int tmp = st.top();
st.pop();
res[tmp] = i-tmp;
}
//當前位置永遠都會入棧,因爲每個元素都要計算天數.
st.push(i);
}
return res;
}
};