題目鏈接:每日溫度
題目描述:
請根據每日 氣溫 列表,重新生成一個列表。對應位置的輸出爲:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會升高,請在該位置用 0 來代替。
例如,給定一個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:氣溫 列表長度的範圍是 [1, 30000]。每個氣溫的值的均爲華氏度,都是在 [30, 100] 範圍內的整數。
題目分析:對比分析之前做過的接雨水題目,藉助單調棧的思想。題目要求的天數爲下標之差,使用一個棧來存儲元素的下標,單調棧,顧名思義,是一個滿足單調遞增或者遞減的棧。我們維護一個下標對應的溫度值遞減的棧,過程如下:
遍歷數組T,如果棧爲空則進棧,否則比較Ti與棧頂值的大小,如果小於棧頂繼續進棧,否則將棧頂元素出棧,直到棧頂大於Ti,同時,在這個過程中更新resi的值。爲什麼可以更新呢?可以看出,由於這個棧的特點,當碰到大於棧頂的Ti時,此時這個Ti一定是右邊第一個大於棧頂的值,否則棧頂元素在這之前會被彈出,滿足題目要求的至少等待天數,即遇到第一個比他大的值進行更新。
注意:棧存儲的只是下標,我們說的值大小是下標所對應的Ti值
代碼:
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<Integer> st = new Stack<>();
for(int i = 0;i < T.length;i++){
while(!st.isEmpty()&&T[i]>T[st.peek()]){//遇到第一個比它大的
res[st.peek()] = i - st.pop();//更新
}
st.push(i);//否則入棧
}
return res;
}
}