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

相关推荐
apocelipes几秒前
golang unique包和字符串内部化
java·python·性能优化·golang
丁浩6662 小时前
Python机器学习---2.算法:逻辑回归
python·算法·机器学习
伏小白白白2 小时前
【论文精度-2】求解车辆路径问题的神经组合优化算法:综合展望(Yubin Xiao,2025)
人工智能·算法·机器学习
驰羽2 小时前
[GO]GORM 常用 Tag 速查手册
开发语言·后端·golang
无敌最俊朗@3 小时前
数组-力扣hot56-合并区间
数据结构·算法·leetcode
囚生CY3 小时前
【速写】优化的深度与广度(Adam & Moun)
人工智能·python·算法
码农多耕地呗3 小时前
力扣94.二叉树的中序遍历(递归and迭代法)(java)
数据结构·算法·leetcode
微笑尅乐4 小时前
BFS 与 DFS——力扣102.二叉树的层序遍历
leetcode·深度优先·宽度优先
懒羊羊不懒@4 小时前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
白云千载尽5 小时前
leetcode 912.排序数组
算法·leetcode·职场和发展