【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)

🌡️ LeetCode 739:每日温度(详解 + 单调栈 + 多种思路对比)

📌 题目描述

给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指在第 i 天之后,才会有更高温度的天数。如果之后没有更高的温度,answer[i] = 0

🔍 示例:

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

💡 解题思路

这是一道经典的 单调栈应用题,本质是要寻找「下一个更大的元素」,具体分析如下:

✅ 方法一:单调递减栈(推荐,最优解法)

  • 栈中存的是 索引(index) ,栈顶元素对应的温度总是 比当前元素大或相等
  • 遍历过程中,一旦遇到比栈顶索引所指温度高的当前值,就开始出栈,并计算天数差值;
  • 最终形成一个从左到右的高温等待天数列表。

🔄 模拟过程(以 [73,74,75,71,69,72,76,73] 为例):

  • 遇到 74 > 73,计算 1 天;
  • 遇到 75 > 74,计算 1 天;
  • 后面直到遇到 76 > 72,再更新;
  • 这样一步步更新每个位置等到更高温度的天数。

💻 Go 实现代码

go 复制代码
func dailyTemperatures(temperatures []int) []int {
    n := len(temperatures)
    answer := make([]int, n)
    stack := []int{} // 存索引

    for i := 0; i < n; i++ {
        for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack)-1]] {
            idx := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            answer[idx] = i - idx
        }
        stack = append(stack, i)
    }

    return answer
}

⏱️ 复杂度分析

项目 复杂度
时间复杂度 O(n) (每个元素最多被入栈出栈一次)
空间复杂度 O(n) (栈和输出数组占用空间)

🔄 方法二:暴力双重循环(超时 or 不推荐)

  • 对于每一个位置,向后扫描直到找到更高温度;
  • 时间复杂度为 O(n\^2),无法通过大规模数据。

✅ 总结

解法 时间复杂度 空间复杂度 是否推荐
单调栈 O(n) O(n) ✅✅✅ 强烈推荐
暴力解法 O(n\^2) O(1)

🧠 思维拓展


💡 如果你觉得这篇文章对你有帮助,欢迎 点赞 👍 收藏 ⭐ 关注 🧡,后续我会继续更新 LeetCode 高质量题解!

相关推荐
徐归阳1 小时前
第三十七天:2025 图形绘制
算法
weixin_429630261 小时前
机器学习-第三章 线性模型
人工智能·算法·机器学习
小哈里1 小时前
【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
数据库·缓存·中间件·golang·后端开发
come112342 小时前
Go 和云原生 的现状和发展前景
开发语言·云原生·golang
专家大圣2 小时前
Bililive-go+cpolar:跨平台直播录制的远程管理方案
开发语言·网络·后端·golang·内网穿透·设计工具
补三补四2 小时前
图卷积网络 (GCN)
网络·人工智能·深度学习·神经网络·算法·机器学习
未知陨落2 小时前
LeetCode:82.杨辉三角
算法·leetcode
CoovallyAIHub3 小时前
全球首个精细梯田地块数据集GTPBD发布:为梯田遥感研究填补空白(附数据地址)
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
【一周AI风暴】周鸿祎放话“不用AI就裁员”,前谷歌CEO鼓吹对华996血拼!
深度学习·算法·计算机视觉
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 55: 子集、找出所有子集的异或总和再求和
数据结构·算法·leetcode·决策树·深度优先·剪枝