LeetCode739 每日温度
题目描述
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
题解
暴力解法
思路
针对每日的气温向后搜索,找到比它大的气温。
复杂度
时间复杂度
O
(
n
)
=
n
2
O(n)=n^2
O(n)=n2
其中,
n
n
n为气温列表长度,即
n
=
30000
n=30000
n=30000。
我的方法
思路
- 从后向前遍历气温列表。
- 维护一个T_count列表,记录在当前日期,所有气温数值要被观测到所需等待的最短天数。
复杂度
时间复杂度
O
(
n
)
=
k
n
O(n)=kn
O(n)=kn
其中,
n
n
n为气温列表长度,即
n
=
30000
n=30000
n=30000;
k
k
k为气温值范围大小,即
k
=
71
k=71
k=71。
空间复杂度
O
(
n
)
=
k
O(n)=k
O(n)=k
其中,
k
k
k为气温值范围大小,即
k
=
71
k=71
k=71。
代码
class Solution(object):
def dailyTemperatures(self, T):
"""
:type T: List[int]
:rtype: List[int]
"""
INF = 40000
num = len(T)
T_count = [INF] * 71 # 30-100
ret = [0] * num
for d in range(num-1, -1, -1): # 7-0
T_count = [i+1 for i in T_count]
if T[d] == 100:
ret[d] = INF
else:
ret[d] = min(T_count[T[d]-29:71])
T_count[T[d]-30] = 0
ret = [0 if i >= INF else i for i in ret]
return ret
动态规划
思路
- 从后往前遍历气温列表。针对每一天,根据动态规划的思路计算结果。
- 最后一天不会再有升高的可能,结果直接为0。
- 要求出第i天对应的结果,只需要知道第i+1天对应的结果就可以:
- 若T[i] < T[i+1],那么res[i]=1;
- 若T[i] > T[i+1]
- res[i+1]=0,那么res[i]=0;
- res[i+1]!=0,那就比较T[i]和T[i+1+res[i+1]](即将第i天的温度与比第i+1天大的那天的温度进行比较),递归地进行。
复杂度
时间复杂度
O
(
n
)
=
k
n
O(n)=kn
O(n)=kn
其中,
n
n
n为气温列表长度,即
n
=
30000
n=30000
n=30000;
k
k
k为气温值范围大小,即
k
=
71
k=71
k=71。
空间复杂度
O
(
n
)
=
k
O(n)=k
O(n)=k
其中,
k
k
k为气温值范围大小,即
k
=
71
k=71
k=71。
代码
class Solution(object):
def dailyTemperatures(self, T):
"""
:type T: List[int]
:rtype: List[int]
"""
def compare(pre, ref, ret):
if T[pre] < T[ref]:
return 1
else:
if ret[ref] == 0:
return 0
else:
tmp = compare(pre, ref+ret[ref], ret)
if tmp == 0:
return 0
else:
return ret[ref] + tmp
num = len(T)
ret = [0] * num
for d in range(num-2, -1, -1): # 6-0
ret[d] = compare(d, d+1, ret)
return ret
单调栈
思路
- 最终要返回的结果记录在 r e t ret ret 列表中。
- 维护一个单调递减栈(先进后出),递减针对气温数值,栈中记录下标。从左往右依次对每一天的气温进行处理。
- 对第
d
d
d 天:
- 如果当前栈为空,则将 d d d 压入栈。
- 否则,比较栈顶元素
p
r
e
v
_
d
prev\_d
prev_d 对应的温度
T
[
p
r
e
v
_
d
]
T[prev\_d]
T[prev_d] 与
d
d
d 对应的温度
T
[
d
]
T[d]
T[d] :
- 如果 T [ p r e v _ d ] > T [ d ] T[prev\_d] > T[d] T[prev_d]>T[d],则将 d d d 压入栈。
- 否则,将 p r e v _ d prev\_d prev_d 弹出栈,将 r e t [ p r e v _ d ] ret[prev\_d] ret[prev_d] 赋值为 d − p r e v _ d d-prev\_d d−prev_d 并继续对第 d d d 天进行如上操作。
复杂度
时间复杂度
每天进出栈一次。
O
(
n
)
=
n
O(n)=n
O(n)=n
其中,
n
n
n为气温列表长度,即
n
=
30000
n=30000
n=30000。
空间复杂度
O
(
n
)
=
k
O(n)=k
O(n)=k
其中,
k
k
k为气温值范围大小,即
k
=
71
k=71
k=71。
代码
class Solution(object):
def dailyTemperatures(self, T):
"""
:type T: List[int]
:rtype: List[int]
"""
stack = []
num = len(T)
ret = [0] * num
for d in range(num):
while stack and T[stack[-1]] < T[d]:
prev_d = stack.pop()
ret[prev_d] = d - prev_d
stack.append(d)
return ret