leetcode刷題(85) 739 每日溫度

2021-10-07 02:36:18 字數 2120 閱讀 5228

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

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

1.暴力法

public int

dailytemperatures

(int

t)}}

return res;

}

2.單調棧

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

正向遍歷溫度列表。對於溫度列表中的每個元素 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=0i=0 時,單調棧為空,因此將 00 進棧。

stack=[0(73)]

ans=[0,0,0,0,0,0,0,0]

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

stack=[1(74)]

ans=[1,0,0,0,0,0,0,0]

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

stack=[2(75)]

ans=[1,1,0,0,0,0,0,0]

當 i=3i=3 時,由於 7171 小於 7575,因此將 33 進棧。

stack=[2(75),3(71)]

ans=[1,1,0,0,0,0,0,0]

當 i=4i=4 時,由於 6969 小於 7171,因此將 44 進棧。

stack=[2(75),3(71),4(69)]

ans=[1,1,0,0,0,0,0,0]

當 i=5時,由於 7272 大於 6969 和 7171,因此依次移除棧頂元素 44 和 33,賦值 ans[4]:=5−4 和 ans[3]:=5−3,將 55 進棧。

stack=[2(75),5(72)]

ans=[1,1,0,2,1,0,0,0]

當 i=6時,由於 7676 大於 7272 和 7575,因此依次移除棧頂元素 55 和 22,賦值 ans[5]:=6−5 和 ans[2]:=6−2,將 66 進棧。

stack=[6(76)]

ans=[1,1,4,2,1,1,0,0]

當 i=7時,由於 7373 小於 7676,因此將 77 進棧。

stack=[6(76),7(73)]

ans=[1,1,4,2,1,1,0,0]

public int

dailytemperatures2

(int

t)stack.

push

(i);

}return ans;

}

開始刷題LeetCode

今天決定開始刷題,每天至少一題,如果題目確實沒有解決出來沒有關係,但是要保證每天至少接觸了一道新的題目!一定要堅持下去,現在是個菜鳥可能會感覺有點難度,堅持下去,總有一天會好的!今天是第一天,做的第乙個題目 reverse words in a string given an input strin...

leetcode刷題歷程

難度 簡單 題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 ...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...