題目
給定一個非空整數列表 temperatures ,該列表依次記錄了每日溫度,請計算在每一天需要等幾天纔會有更高的溫度,並將結果通過列表返回。
說明:如果氣溫在這之後都不會升高,請在該位置用 0 來代替。
例如:
給定一個列表:[73, 74, 75, 71, 69, 72, 76, 73],返回結果:[1, 1, 4, 2, 1, 1, 0, 0]
給定一個列表:[30, 25, 35, 32],返回結果:[2, 1, 0, 0]
解釋:
[30, 25, 35, 32] 表示該列表記錄了4日溫度,第 1 日爲30,第 2 日爲25,第 3 日爲35,第 4 日爲32 ;
[2, 1, 0, 0] 表示該列表每日需要等幾天纔會有更高的溫度,第 1 日需要等 2 天后溫度升高到35,第 2 日需要等 1 天后溫度升高到35,第 3、4 日後溫度都不會升高,所以都是 0
實現思路1
- 直接暴力破解
- 第一層遍歷設置當前溫度的位置 i,第二層遍歷設置當前溫度之後的位置 j
- 每次遍歷時尋找出溫度升高的下一天,然後通過下標計算得出相差的天數 j - i ,並跳出第二層循環
代碼實現
def dailyTemperatures(temperatures):
res = []
for i in range(len(temperatures)):
count = 0
for j in range(i + 1, len(temperatures)):
if temperatures[j] > temperatures[i]:
count += j - i
res.append(count)
break
else: # for ... else 只有在 for 中全部遍歷完,且for中沒有因 break 提前跳出循環時才執行else
res.append(0)
return res
實現思路2
- 藉助
棧
來實現 - 用列表 res 表示返回的結果,並設置默認值爲
[0] * len(temperatures)
,用列表 stack 表示棧,其用於存儲當前溫度的下標 i - 第一層
for
遍歷 temperatures ,每次遍歷都需把當前溫度的下標 i 添加到 stack - 第二層用
while
循環 stack ,如果非空並且當前溫度大於棧頂元素對應的溫度,那麼執行出棧,直到棧頂元素對應的溫度大於當前溫度 - 每次 stack 執行出棧時,可以計算得出當前溫度升高所需的天數
i - stack.pop()
代碼實現
def dailyTemperatures(temperatures):
res = [0] * len(temperatures)
stack = []
for i, cur in enumerate(temperatures):
while stack and cur > temperatures[stack[-1]]:
index = stack.pop()
res[index] = i - index
stack.append(i)
return res