根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。
例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。
無腦版:對每個數字,向後掃瞄,如果比它大則記錄距離,時間複雜度o(n2)
改進版:
從後向前遍歷,同時用乙個棧儲存所有>= temperature[index + 1]
的temperature, index
。
為什麼要儲存這種棧呢?
如果temperature[index] < temperature[index + 1]
,則經過1天即可
如果temperature[index] >= temperature[index + 1]
,則比temperature[index + 1]
小的溫度儲存了也沒用,這是需要不斷pop棧,直到找到比temperature[index]
大的溫度為止。
具體的實現就是:倒序遍歷溫度列表,同時用棧儲存掃瞄過的溫度+索引。若掃瞄棧為空,則當前氣溫對應0,否則一直pop掃瞄溫度直到找到比當前溫度高的溫度,當前溫度對應的數字就是比它大的溫度索引和自己的下標之差。然後把當前溫度入掃瞄棧。時間複雜度是o(n)
class
solution
:def
dailytemperatures
(self, t: list[
int])-
> list[
int]
: stack =
ret_list =
for index in
range
(len
(t)-1,
-1,-
1):if
not stack:0)
(t[index]
, index)
)else
: wait =
0while stack:
next_temp, next_index = stack.pop(
)if next_temp > t[index]
: wait = next_index - index
(next_temp, next_index)
)break
(t[index]
, index)
)return ret_list[::
-1]
看了官方題解,發現其實棧內可以儲存下標,而不需要儲存溫度,溫度可以直接用下標訪問,更簡潔的寫法如下:
class
solution
:def
dailytemperatures
(self, t: list[
int])-
> list[
int]
: stack =
ans =
for index in
range
(len
(t)-1,
-1,-
1):while stack and t[stack[-1
]]<= t[index]
: stack.pop()-
1]- index if stack else0)
return ans[::
-1]
LeetCode 739 每日溫度
根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高的天數。如果之後都不會公升高,請輸入 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 static con...
LeetCode 739 每日溫度
根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高的天數。如果之後都不會公升高,請輸入 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 從後一天往前一天推,...
leetcode739 每日溫度
即找之後第乙個比自己大的元素 參考 用棧實現 將元素 下標 依次入棧並且保證棧內元素從棧頂到棧底是遞增的。如果當前元素比棧頂元素大,則說明當前元素就是比棧頂元素大的第乙個元素,求出兩個下標的差值即為棧頂元素對應的結果。依次出棧並計算下標差直到棧頂元素大於當前元素,將當前元素入棧 比如 t 73,74...