【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 高质量题解!

相关推荐
moxiaoran575331 分钟前
Go语言的范围range
golang
zfj32134 分钟前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_462446231 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang
Dingdangcat861 小时前
城市交通多目标检测系统:YOLO11-MAN-FasterCGLU算法优化与实战应用_3
算法·目标检测·目标跟踪
小信啊啊1 小时前
Go语言切片slice
开发语言·后端·golang
tang&2 小时前
滑动窗口:双指针的优雅舞步,征服连续区间问题的利器
数据结构·算法·哈希算法·滑动窗口
拼命鼠鼠2 小时前
【算法】矩阵链乘法的动态规划算法
算法·矩阵·动态规划
LYFlied2 小时前
【每日算法】LeetCode 17. 电话号码的字母组合
前端·算法·leetcode·面试·职场和发展
式5162 小时前
线性代数(八)非齐次方程组的解的结构
线性代数·算法·机器学习
橘颂TA3 小时前
【剑斩OFFER】算法的暴力美学——翻转对
算法·排序算法·结构与算法