Mar 1 每日溫度(中等)

2021-10-20 18:11:49 字數 2629 閱讀 9171

739. 每日溫度

思路一開始想到的是暴力求解,每遍歷乙個溫度,就往後尋找比它大的那個數,直到找到為止。這種方法不出意料,超時。

這題便簽是棧,故用棧來解決。這裡直接複製leetcode的官方解法說明,與我的大同小異。

可以維護乙個儲存下標的單調棧,從棧底到棧頂的下標對應的溫度列表中的溫度依次遞減。如果乙個下標在單調棧裡,則表示尚未找到下一次溫度更高的下標。

正向遍歷溫度列表。對於溫度列表中的每個元素 t[i],如果棧為空,則直接將 i 進棧,如果棧不為空,則比較棧頂元素 previndex 對應的溫度 t[previndex] 和當前溫度 t[i],如果 t[i] > t[previndex],則將 previndex 移除,並將 previndex 對應的等待天數賦為 i - previndex,重複上述操作直到棧為空或者棧頂元素對應的溫度小於等於當前溫度,然後將 i 進棧。

為什麼可以在彈棧的時候更新 ans[previndex] 呢?因為在這種情況下,即將進棧的 i 對應的 t[i] 一定是 t[previndex] 右邊第乙個比它大的元素,試想如果 previndex 和 i 有比它大的元素,假設下標為 j,那麼 previndex 一定會在下標 j 的那一輪被彈掉。

由於單調棧滿足從棧底到棧頂元素對應的溫度遞減,因此每次有元素進棧時,會將溫度更低的元素全部移除,並更新出棧元素對應的等待天數,這樣可以確保等待天數一定是最小的。

以下用乙個具體的例子幫助讀者理解單調棧。對於溫度列表 [73,74,75,71,69,72,76,73],單調棧 stack 的初始狀態為空,答案ans 的初始狀態是 [0,0,0,0,0,0,0,0],按照以下步驟更新單調棧和答案,其中單調棧內的元素都是下標,括號內的數字表示下標在溫度列表中對應的溫度。

當 i=0 時,單調棧為空,因此將 0 進棧。

當 i=1時,由於 74 大於 73,因此移除棧頂元素 0,賦值 ans[0]:=1−0,將 1 進棧。

當 i=2時,由於 75 大於 74,因此移除棧頂元素 1,賦值 ans[1]:=2−1,將 2 進棧。

當 i=3 時,由於 71 小於 75,因此將 3 進棧。

當 i=4 時,由於 69 小於 71,因此將 4 進棧。

當 i=5 時,由於 72 大於 69 和 71,因此依次移除棧頂元素 4 和 3,賦值 ans[4]:=5−4 和 ans[3]:=5−3,將 5 進棧。

當 i=6 時,由於 76 大於 72 和 75,因此依次移除棧頂元素 5 和 2,賦值 ans[5]:=6−5 和 ans[2]:=6−2,將 6 進棧。

當 i=7 時,由於 73 小於 76,因此將 7 進棧。

# python3

class

solution

:def

dailytemperatures

(self, t: list[

int])-

> list[

int]

: l =

len(t)

stack =

list()

ans =[0

]* l

for i in

range

(l):

for _ in

range

(len

(stack)):

if t[i]

> t[stack[-1

]]: ans[stack[-1

]]= i - stack[-1

] stack.pop(

)else

:break

return ans

執行用時:

644 ms, 在所有 python3 提交中擊敗了12.90%的使用者

記憶體消耗:

19.7 mb, 在所有 python3 提交中擊敗了10.51%的使用者

效率一般,做改進,將for迴圈簡化成while:

# python3

class

solution

:def

dailytemperatures

(self, t: list[

int])-

> list[

int]

: l =

len(t)

stack =

list()

ans =[0

]* l

for i in

range

(l):

while stack and t[i]

> t[stack[-1

]]: ans[stack[-1

]]= i - stack[-1

] stack.pop(

)return ans

執行用時:

480 ms, 在所有 python3 提交中擊敗了99.00%的使用者

記憶體消耗:

19 mb, 在所有 python3 提交中擊敗了58.52%的使用者

每日練習1

1.internet中地理網域名稱中國的縮寫是 b 2.設立資料鏈路層的主要畝的是將一條原始的 有差錯的物理線路變為對網路層無差錯的 b 3.如果借用 c 類 ip 位址中的 4 位主機號劃分子網,那麼子網掩碼應該為 4.使用者資料報 udp 的首部欄位有 16 個位元組,這種說法正確嗎?解析 ud...

每日英語(1)

單詞 翻譯significant 顯著的impact 影響 衝擊 infrastructure 基礎設施 underlying 底層的 潛在的 oriented 面向 的 multiplex 多元 多路 illustrate 說明mux 使 混亂 mix使 混合 allocate 分配 助記 al ...

每日演算法 1

1 leetcode第46題 全排列 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 1 思路 核心思想是在乙個排列的基礎上,1,2,3,按照規律交換位置,得到新的排列。比如1和2交換 2,1,...