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) 高效、最优解 逻辑稍复杂
相关推荐
Nil2087 小时前
leetcode 138随机链表的复制
算法·leetcode·链表
疯狂打码的少年9 小时前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
-凌凌漆-10 小时前
【freertos】Task创建(v2)
java·开发语言·算法
Nil20810 小时前
leetcode 24两两交换链表中的节点
算法·leetcode·链表
.格子衫.10 小时前
033动态规划之状态压缩DP——算法备赛
算法·动态规划
ysa05103010 小时前
c++常用自带函数用法与注意
c++·笔记·算法
带多刺的玫瑰12 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王12 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes12 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent