当前位置: 首页 > article >正文

LeetCode 热题 100 739. 每日温度

LeetCode 热题 100 | 739. 每日温度

大家好,今天我们来解决一道经典的算法题——每日温度。这道题在 LeetCode 上被标记为中等难度,要求我们找到一个数组,其中每个元素表示从当前天开始,下一个更高温度出现的天数。如果之后没有更高的温度,则用 0 代替。下面我将详细讲解解题思路,并附上 Python 代码实现。


问题描述

给定一个整数数组 temperatures,表示每天的温度。返回一个数组 answer,其中 answer[i] 是指对于第 i 天,下一个更高温度出现的天数。如果之后没有更高的温度,则用 0 代替。

示例 1:

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

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

解题思路

核心思想
  1. 单调栈

    • 使用一个栈来存储温度的索引,栈内元素保持单调递减的顺序。
    • 遍历温度数组时,如果当前温度大于栈顶温度,说明找到了一个更高的温度,可以更新答案并弹出栈顶元素。
    • 如果当前温度小于或等于栈顶温度,直接将当前索引入栈。
  2. 答案数组初始化

    • 初始化答案数组 answer,长度与 temperatures 相同,所有元素初始值为 0。如果后续没有找到更高的温度,这些位置的值将保持为 0

Python代码实现

def dailyTemperatures(temperatures):n = len(temperatures)answer = [0] * n  # 初始化答案数组stack = []  # 单调栈,存储温度的索引for i, temp in enumerate(temperatures):# 当前温度大于栈顶温度,更新答案并弹出栈顶元素while stack and temp > temperatures[stack[-1]]:prev_index = stack.pop()answer[prev_index] = i - prev_index# 当前索引入栈stack.append(i)return answer# 测试示例
print(dailyTemperatures([73,74,75,71,69,72,76,73]))  # 输出: [1,1,4,2,1,1,0,0]
print(dailyTemperatures([30,40,50,60]))  # 输出: [1,1,1,0]
print(dailyTemperatures([30,60,90]))  # 输出: [1,1,0]

代码解析

  1. 初始化答案数组和栈

    • answer 初始化为长度为 n 的数组,所有元素为 0
    • stack 用于存储温度的索引,保持单调递减的顺序。
  2. 遍历温度数组

    • 使用 enumerate 遍历温度数组,同时获取索引和温度值。
  3. 更新答案并弹出栈顶元素

    • 如果当前温度大于栈顶温度,说明找到了一个更高的温度,计算天数差并更新答案数组,然后弹出栈顶元素。
    • 重复上述步骤,直到栈为空或当前温度小于等于栈顶温度。
  4. 当前索引入栈

    • 将当前索引入栈,继续遍历。
  5. 返回答案数组

    • 最终返回答案数组 answer

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。每个元素最多入栈和出栈一次。
  • 空间复杂度:O(n),栈的大小最多为 n

示例运行

示例 1
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3
输入: temperatures = [30,60,90]
输出: [1,1,0]

总结

通过使用单调栈,我们可以高效地找到每个温度之后的第一个更高温度。这种方法不仅简洁,而且效率非常高,适合处理类似的问题。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

http://www.lryc.cn/news/2399557.html

相关文章:

  • 网页前端开发(基础进阶3--Vue)
  • tryhackme——Abusing Windows Internals(进程注入)
  • 【游戏科学】游戏开发中数学算法的核心与应用
  • 【Day44】
  • 基于 Alpine 定制单功能用途(kiosk)电脑
  • 知识图谱系统功能实现,技术解决方案,附源码
  • 第12节 Node.js 函数
  • 洛谷P12610 ——[CCC 2025 Junior] Donut Shop
  • 1. 数据库基础
  • 英伟达288GB HBM4+50P算力
  • 【Pandas】pandas DataFrame reset_index
  • 综合案例:斗地主
  • 前端组件推荐 Swiper 轮播与 Lightbox 灯箱组件深度解析
  • 解密并下载受DRM保护的MPD(DASH流媒体)加密视频
  • 数据可视化有哪些步骤?2025高效落地指南
  • Deepfashion2 数据集使用笔记
  • Dify知识库下载小程序
  • 匀速旋转动画的终极对决:requestAnimationFrame vs CSS Animation
  • 数据库中求最小函数依赖集-最后附解题过程
  • 嵌入式系统中常用的开源协议
  • MySQL 索引底层原理剖析:B+ 树结构、索引创建维护与性能优化策略全解读
  • 系统架构设计论文
  • 第二篇:Liunx环境下搭建PaddleOCR识别
  • 图片上传问题解决方案与实践
  • 复杂业务场景下 JSON 规范设计:Map<String,Object>快速开发 与 ResponseEntity精细化控制HTTP 的本质区别与应用场景解析
  • 二叉数-965.单值二叉数-力扣(LeetCode)
  • redis集群和哨兵的区别
  • [蓝桥杯]对局匹配
  • BBU 电源市场报告:深入剖析与未来展望​
  • Redis 持久化机制详解:RDB 与 AOF 的原理、优缺点与最佳实践