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 dprev_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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值