LeetCode每日一题: 739. 每日温度

739. 每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

思路
方法一: 直接求解, 利用字典提高性能

  1. 逆向遍历气温列表
  2. 对每个气温, 遍历字典, 找出温度更高并且距离最近的索引
    • 因为只有[30,100]区间的整数气温, 使用字典将所有气温离当前最近的索引记录下来, 遍历会比较快
  3. 时间复杂度为: O(k*n), 其中k为气温区间的整数数量, n为列表长度

方法二: 栈

  1. 逆向遍历气温表
  2. 用栈记录气温的索引
  3. 对每个气温, 对比当前气温和栈顶气温
    • 如果当前气温>栈顶气温, 且栈不为空, 则弹出栈顶元素
    • 直到当前气温<栈顶气温, 停止栈, 然后记录当前气温与最近的更高气温的索引差值
# 方法一
class Solution:
    def dailyTemperatures(self, T: List[int]) -> List[int]:
        len_T = len(T)
        if len_T == 0: return []

        tmp_dic={} # 温度字典, 用于存储所有温度最近的index
        lst=[0] * len_T # 用于记录最终结果的列表

        # 遍历T列表
        for i in range(len_T-1, -1, -1):
            # 在字典中找到比当前温度高, 且索引距离最近的气温索引,记录到列表中
            for tmp in dic:
                if tmp>T[i]:
                    if lst[i] == 0 or lst[i] > dic[j]-i:
                        lst[i] = dic[j]-i           
            # 把当天的温度记录到字典中     
            dic[T[i]] = i
        return lst

# 方法二: 栈
class Solution:
    def dailyTemperatures(self, T: List[int]) -> List[int]:
        ans = [0] * len(T)
        stack = []
        
        for i in range(len(T)-1, -1, -1):
            while stack and T[i] >= T[stack[-1]]:
                stack.pop()
            if stack:
                ans[i] = stack[-1] - i
            stack.append(i)
        return ans

你可能感兴趣的:(LeetCode每日一题: 739. 每日温度)