欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)

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

2025/5/19 5:15:53 来源:https://blog.csdn.net/qq_47831505/article/details/148048167  浏览:    关键词:【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 实现代码

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)$

🧠 思维拓展

  • 单调栈结构可用于「下一个更大元素」「区间最大值」等问题;

  • 同类题目推荐:

    • 496. 下一个更大元素 I
    • 503. 下一个更大元素 II
    • 84. 柱状图中最大的矩形

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词