單調棧 每日溫度

2021-10-07 02:27:26 字數 1427 閱讀 9945

題目

根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸出是需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。

例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

思路

理解題目以後,直接想到的思路就是 逐個遍歷,然後對每個元素 向後遍歷尋找比他大的元素,下標差 則是解,**見1笨方法。

這種每個都去遍歷的場景,很容易出現重複計算,由於是向右邊找,如果想利用前面的計算成果,當然是從右邊開始遍歷啦。當右邊的res陣列已經計算完畢以後,如果你對i這個下標進行查詢,

(1)發現 i+1符合要求,而i+1已經計算過了,則可以直接跨res[i+1] 個下標,繼續匹配大小。就節省了重複的遍歷,提高效率。

(2)如果你發現i+1不符合要求,並且 res[i+1]是0 ,請立馬結束遍歷,res[i] 必須是0(這個也是重點)。

**見2.笨方法的優化

也可以使用棧來實現這個功能,如果你儲存元素的值的話,當出棧以後。你不知道他下標是啥,就無法 對res賦值。所以更機智的辦法就是直接在棧裡儲存下標,反正有陣列。下標就能代表整個元素,完美! 由於是要 尋找比他大的元素,so,

(1)當遍歷到的元素,比棧頂元素 大的時候,妥妥的出棧,然後求個下標差就好了嘛。不過這是其中一種場景

(2)如果遍歷到的元素比棧頂小,就要先入棧,猥瑣發育,別浪,(當然棧裡面元素目前是單調遞減哦)當遇到比棧頂大的以後,棧頂出棧!計算下標差,放入res陣列。然後新棧頂來到pk台上,若遍歷到的元素繼續衛冕冠軍,新棧頂出棧!直到棧內 沒有元素了 或者 棧裡元素更大,那衛冕冠軍的下標就入棧咯。所以 for迴圈裡面對棧的操作要是個while迴圈,(當棧內有元素並且棧頂元素比 目前遍歷的元素小,要一直不停的比較,出棧)結束以後,當前遍歷的元素下標入棧就好了嘛。結束!

1.笨方法

public

int[

]getres

(int

t)}}

return res;

}

2.笨辦法的優化

public

int[

]getres

(int

t)else

if(res[j]==0

)}}return res;

}

3.單調棧 (知識點)

public

int[

]getres

(int

t)stack.

push

(t[i]);

}return res;

}

leetcode 每日溫度(單調棧)

類似於 柱狀圖中最大的矩形 單調棧 請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為 要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該...

739 每日溫度 單調棧

739.每日溫度 o n 2 o n 2 o n2 class solution else res i tmp return res o n o n o n class solution stack.push i return res 單調棧 monotone stack 是指棧內元素 棧底到棧頂 ...

單調棧 739 每日溫度

請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為 要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 ...