根據每日氣溫列表,請重新生成乙個列表,對應位置的輸入是你需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。
例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。
氣溫 列表長度的範圍是 [1, 30000]。每個氣溫的值的均為華氏度,都是在 [30, 100] 範圍內的整數。
對於給定的temperatures陣列t,對於任意位置的值,只需要找到下乙個比當前值大的值即可。所以,最直接的方法應該是從頭開始遍歷陣列,暴力法解決問題。但是這種辦法在資料量變大的時候,測試會出現超時問題。
所以考慮是否可以對陣列進行剪枝操作。
用陣列result記錄結果,如果反向遍歷陣列t,那麼
當t[m]t[i]時,把元素i去掉,因為該元素之前有比它大的元素,所以它不會再起作用,進行下乙個迴圈。
核心思想就是在反向遍歷過程中,如果出現比當前元素大的值,則當前元素將不再對結果起任何作用,因為被它之前的值擋住了。
**如下:
class
solution
:def
dailytemperatures
(self, t)
: temp =[0
for i in
range
(len
(t))
]while t:
t = t.pop(
)for i in
range
(len
(t)-1,
-1,-
1):if t[i]
>= t:
break
else
: temp[i]
=len
(t)-i
return temp
測試結果:
改進思路:
依然反向遍歷,但是在遍歷過程中,使用棧來記錄不同日期t值的位置資訊。並使棧承單調排列,還是核心思想,如果前一位的值比後一位的值大,則後一位的值將不再起作用,即可以從出棧。
**如下:
class
solution
:def
dailytemperatures
(self, t)
: temp =[0
for i in
range
(len
(t))
] size =
len(t)
stack =
[size-1]
for i in
range
(size-2,
-1,-
1):while stack and t[i]
>= t[stack[-1
]]: stack.pop()if
len(stack)
>1:
temp[i]
= stack[-2
]- stack[-1
]return temp
通過建立輔助棧,進行對溫度進行排序,可以大大縮減時間。主要還是要搞清楚什麼時候應該用棧這種資料結構,像這道題中,輔助棧中的末尾元素可以被後進來的元素「擠掉」,這就是典型的lifo。這道題還有一種正向遍歷的思路的類似思路。**如下:
class
solution
:def
dailytemperatures
(self, t)
: size =
len(t)
temp =[0
for i in
range
(size)
] stack =
for i in
range
(size)
:while stack and t[i]
> t[stack[-1
]]: last_i = stack.pop(
) temp[last_i]
= i - last_i
return temp
python資料結構與演算法
coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...
資料結構與演算法 python
元類 基礎 冒泡 它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名氣泡排序。def bubble sort alist ...
python演算法與資料結構
若n1 n2 n3 1000,且n1平方 n2平方 n3平方 n1,n2,n3為自然數 求出所有n1 n2 n3可能的組合?n1 0 n2 0 n3 0 判斷n1 n2 n3是否等於1000,之後變n3 1,n3 2,n3 3,然後再變n2 那如果變為 n1 n2 n3 2000 了呢?思路1 實現...