leetcode739每日溫度

題目鏈接:每日溫度
題目描述:
請根據每日 氣溫 列表,重新生成一個列表。對應位置的輸出爲:要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會升高,請在該位置用 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;
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章