Leetcode 739. 每日温度

心路历程:

暴力解很好想到,就是一个On2的双层循环即可,但是会超时。于是第一反应想到了动态规划,这道题的动态规划思路其实本质上有点像那个跳跃游戏,相当于跳着比较从而减少遍历复杂度。

后来从网上发现这道题是经典的单调栈题目,从后向前遍历,当新遇到的值比之前的元素大的时候,就把比它小的全部pop出去。

解法一:单调栈

python 复制代码
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        # 单调栈
        n = len(temperatures)
        ans = [0] * n
        st = []
        for i in range(n-1, -1, -1):
            while st and temperatures[i] >= temperatures[st[-1]]: st.pop()  # 丢弃掉比当前值小且排在后面的栈中元素
            if st:  # 可能没有比当前元素大的数了
                ans[i] = st[-1] - i
            st.append(i)  # 每个元素都进栈
        return ans  

解法二:动态规划:

python 复制代码
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        @cache
        def dp(i):  # 第i天的下一个最高温度在几天后
            if i == len(temperatures) - 1: return 0
            if temperatures[i] < temperatures[i+1]:
                return 1
            else:
                k = i + 1
                while k <= len(temperatures) - 1:
                    nextbig = dp(k)
                    if nextbig == 0: break
                    k += nextbig
                    if temperatures[k] > temperatures[i]:
                        return k - i
                return 0
        res = []
        for i in range(len(temperatures)):
            res.append(dp(i))
        return res
相关推荐
铉铉这波能秀19 分钟前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
蜡笔小马28 分钟前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
我是咸鱼不闲呀33 分钟前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中37 分钟前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
仟濹39 分钟前
【算法打卡day3 | 2026-02-08 周日 | 算法: BFS】3_卡码网99_计数孤岛_BFS | 4_卡码网100_最大岛屿的面积DFS
算法·深度优先·宽度优先
Ll130452529842 分钟前
Leetcode二叉树part4
算法·leetcode·职场和发展
颜酱1 小时前
二叉树遍历思维实战
javascript·后端·算法
宝贝儿好1 小时前
第二章: 图像处理基本操作
算法
小陈phd1 小时前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习
@––––––1 小时前
力扣hot100—系列4-贪心算法
算法·leetcode·贪心算法