LeetCode Hot100(53/100)——739. 每日温度

文章目录

一、题目简介

题目链接:
LeetCode:每日温度

题目描述:

给定一个整数数组 temperatures,表示每天的温度。请返回一个数组 answer,其中 answer[i] 表示第 ( i ) 天之后,需要等待多少天 才会出现更高的温度。如果之后没有更高的温度,请置为 0

示例:

text 复制代码
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

二、问题分析

对于每个温度,我们希望知道下一个更高温度出现的间隔天数。这本质上是一个**"下一个更大元素"问题**的变体。

在这里,数组的元素是温度,而"更大元素"代表"更高温度的天数"。


三、解法思路总览

每日温度
暴力解法
=> 两层循环
=> 每天向后找更高温度
=> 时间复杂度 O(n²)
单调栈解法
=> 使用栈存储索引
=> 栈保持递减温度序
=> 遇到更高温度时出栈更新结果
=> 时间复杂度 O(n)


四、暴力解法

原理

对于每一天,往后依次查看未来的几天,直到找到一个温度更高的日期,并计算等待天数。

思路示意图



第 i 天温度
从 i+1 天起开始搜索
是否出现更高温度?
记录等待天数 j - i
返回 0

Java代码实现:

java 复制代码
public int[] dailyTemperaturesBruteForce(int[] temperatures) {
    int n = temperatures.length;
    int[] res = new int[n];
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (temperatures[j] > temperatures[i]) {
                res[i] = j - i;
                break;
            }
        }
    }
    return res;
}

复杂度分析

指标 复杂度
时间复杂度 ( O(n^2) )
空间复杂度 ( O(1) )

缺点: 当数据量很大时性能极低,需要优化。


五、单调栈优化解法(推荐)

原理讲解

使用一个栈来存储尚未找到更高温度的"索引"

栈中的温度是自顶向下递减的

当我们遇到一个比栈顶温度高的温度时,就意味着栈顶对应的那一天终于"等到了更高温度"。

流程说明

假设温度数组为 [73,74,75,71,69,72,76,73]

我们逐日扫描:

  1. 第一天 73 入栈。
  2. 第二天 74 高于栈顶 73 → 出栈并更新等待天数(1天)。
  3. 继续入栈新的温度。
  4. 重复上面的过程。

最终每个出栈时,都可以知道它要等待多少天。

时序图可视化

结果 栈 当前日 结果 栈 当前日 alt 当前温度更高 当前温度不高 比较温度 更新等待天数 出栈 入栈索引

Java代码实现:

java 复制代码
import java.util.Stack;

public int[] dailyTemperatures(int[] temperatures) {
    int n = temperatures.length;
    int[] res = new int[n];
    Stack<Integer> stack = new Stack<>();

    for (int i = 0; i < n; i++) {
        while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
            int prevIndex = stack.pop();
            res[prevIndex] = i - prevIndex;
        }
        stack.push(i);
    }
    return res;
}

复杂度分析

指标 复杂度
时间复杂度 ( O(n) ) --- 每个元素最多进出栈一次
空间复杂度 ( O(n) ) --- 栈空间存储未匹配的索引

六、对比总结

解法 思路 时间复杂度 空间复杂度 优点 缺点
暴力解法 双重遍历 O(n²) O(1) 简单易懂 性能较差
单调栈 栈存索引递减 O(n) O(n) 高效、最优解 逻辑稍复杂
相关推荐
小欣加油14 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly15 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕16 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei16 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld17 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi818 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang19 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby20 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠20 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力21 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试