Leetcode hot100 每日温度【中等】

法(一)动态规划

直觉就是用动态规划。既然是动态规划,分两步,第一步是定义dp问题,第二步是推导dp公式。

step01 : 定义dp问题。很简单,刚刚好就是原题要的逻辑。dpi记录第一个比第i天高的温度要往后数几天

**step02:**dp公式怎么推呢?找几个温度,脑子演练一下,就推出来了。

比如这个例子:

78,76,73,74,75,77

0, 4, 1, 1, 1, 0

76如何得出4?就能拼出dpi=(j-i),以及下标的传递逻辑j=j+dpj;

78如何得出0?

假如今天是第i天,首先大的值肯定在后面对吧,那么最先遍历的肯定是第i+1天,如果第i+1天就比第i天高,那么dpi=(i+1)-i=1,不用往后找了。如果低于或等于呢?那下一个要比对的不是i+2,而是去对比第一个比第i+1天温度高 的,也就是第i+1+dpi天,同时也是第i天后面所有温度里第一个比第i+1天高的,这样想就明白了------不会"跳过去第1高的去找第2高的"。如果传递式寻找的过程中遇到了dpj=0,那么不用往下传递了,dpi=0。

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        //初始化
        int[] dp=new int[temperatures.length];
        dp[temperatures.length-1]=0;

        for(int i=temperatures.length-2;i>=0;i--){
            int j=i+1;  //从i+1天开始尝试找下一个最大值
            while(j<=temperatures.length-1){
                //1.=====第j日的温度>第i日的温度,相当于找到了
                if(temperatures[j]>temperatures[i]){ //找到了,退出循环
                    dp[i]=(j-i);
                    break; 

                //2.=====第j日的温度<=第i日的温度
                }else{
                    //2.1 =====第j日以后没有更高的温度了
                    if(dp[j]==0){ //确认找不到了,退出循环
                        dp[i]=0;
                        break;
                    }
                    //2.2 ======第j日以后还有更高的温度
                    j=j+dp[j];  //下标:传递式寻找,类似于"依赖的依赖"
                }
            }
        }
            return dp;
    }
}

法(二)单调栈

这个题在leetcode被划入了单调栈的分类里,所以借此机会学一下单调栈。

单调栈 = 始终保持栈内元素单调递增 或 单调递减 的栈。

单调栈最大价值:快速找「左边 / 右边 第一个比自己大 / 小的元素」,正好对应这个题。

单调递减栈的规则:

当前元素<=栈顶元素,满足递减,入栈

当前 元素>栈顶元素,弹出栈顶元素.继续比较下一个栈顶元素,直到栈顶元素<=当前元素或者栈空

java 复制代码
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int length = temperatures.length;
        int[] result = new int[length];
        
        //栈里存的是temperatures的下标,而不是温度
        Deque<Integer> st = new LinkedList<>();
        //初始化
        st.push(0);
        int i=1;
        while(i<length){
            if(temperatures[i]<=temperatures[st.peek()]){
                    st.push(i);
            }else{
                while(!st.isEmpty()&&temperatures[st.peek()]<temperatures[i]){
                    int j=st.peek();
                    result[j]=i-j;
                    st.pop();
                }
                st.push(i);  
            }

            i++;
        }
        
        //最后栈里剩下的,都是没有比他们大的,挨个置0
        while(!st.isEmpty()){
            result[st.pop()]=0;
        }
        
        return result;
    }
}
相关推荐
liulilittle3 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_307779134 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例
量化君也4 小时前
从回测到全自动实盘交易,全天候策略需要经历哪些改造?
大数据·人工智能·python·算法·金融
fox_lht4 小时前
第十五章 函数式语言:迭代器和闭包
开发语言·后端·学习·算法·rust
zhengzhouliuhaha5 小时前
智能医疗设备控费系统:以全院一体化管控,筑牢医疗资源“安全阀”
大数据·数据结构·人工智能·算法·安全·机器学习·软件需求
June`5 小时前
CUDA程序效率如何计算以及工具如何使用
算法·cuda
兰令水5 小时前
leecodecode【树形DP】【2026.6.11打卡-java版本】
java·算法·深度优先
装不满的克莱因瓶5 小时前
RLHF中的PPO算法——大语言模型对齐优化的核心引擎
人工智能·python·深度学习·算法·机器学习·语言模型·自然语言处理
SWAGGY..6 小时前
Linux系统编程:(十三)环境变量
java·linux·算法
Black蜡笔小新6 小时前
自动化AI算法训练服务器DLTM一体化训推平台构建企业专属AI能力中台
人工智能·算法·自动化