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

Leetcode题解:739每日温度,用单调栈解决问题!

一、题目内容

题目要求根据给定的温度数组 temperatures,返回一个数组 answer,其中 answer[i] 表示对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,则在该位置用 0 来代替。

二、题目分析

输入和输出

输入:

  • 一个整数数组 temperatures,表示每天的温度。

输出:

  • 一个整数数组 answer,其中 answer[i] 表示对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,则在该位置用 0 来代替。

算法逻辑

使用单调栈(Monotonic Stack)来解决这个问题。单调栈是一种特殊的栈结构,用于处理数组中的顺序问题,特别是找到下一个更大或更小的元素。

  1. 初始化

    • 创建一个结果数组 result,大小与 temperatures 相同,所有元素初始化为 0。

    • 创建一个栈 stack,用于存储温度的索引。

  2. 遍历温度数组

    • 遍历 temperatures,对于每个温度 temperatures[i]

      • 如果栈不为空且当前温度 temperatures[i] 大于栈顶索引对应的温度 temperatures[stack.top()],则:

        • 弹出栈顶索引 pre

        • 计算索引差值 i - pre,并将其存储到 result[pre] 中。

      • 将当前索引 i 压入栈中。

  3. 返回结果

    • 如果某个位置的温度之后没有更高的温度,则 result 中该位置的值保持为 0。

    • 返回 result

三、解题要点

  1. 单调栈的定义

    • 单调栈是一种特殊的栈结构,用于处理数组中的顺序问题,特别是找到下一个更大或更小的元素。

  2. 栈的使用

    • 栈用于存储温度的索引。

    • 当前温度大于栈顶索引对应的温度时,弹出栈顶索引,并计算索引差值。

  3. 结果数组的初始化

    • 结果数组 result 的大小与 temperatures 相同,所有元素初始化为 0。

  4. 算法复杂度

    • 时间复杂度:O(n),每个元素最多被压入和弹出栈一次。

    • 空间复杂度:O(n),用于存储结果数组和栈。

四、代码解答

以下是使用单调栈算法的 C++ 实现代码:

#include <vector>
#include <stack>using namespace std;class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> result(temperatures.size(), 0); // 初始化结果数组stack<int> stack; // 用于存储温度的索引for (int i = 0; i < temperatures.size(); ++i) {// 当前温度大于栈顶索引对应的温度while (!stack.empty() && temperatures[i] > temperatures[stack.top()]) {int pre = stack.top(); // 栈顶索引stack.pop(); // 弹出栈顶索引result[pre] = i - pre; // 计算索引差值}stack.push(i); // 当前索引入栈}return result;}
};

五、详细注释

  1. 单调栈的作用

    • 单调栈用于处理数组中的顺序问题,特别是找到下一个更大或更小的元素。

    • 在这个问题中,单调栈用于找到每个温度之后的第一个更高温度。

  2. 栈的维护

    • 栈用于存储温度的索引。

    • 当前温度大于栈顶索引对应的温度时,弹出栈顶索引,并计算索引差值。

  3. 结果数组的初始化

    • 结果数组 result 的大小与 temperatures 相同,所有元素初始化为 0。

    • 如果某个位置的温度之后没有更高的温度,则 result 中该位置的值保持为 0。

  4. 终止条件

    • 如果某个位置的温度之后没有更高的温度,则 result 中该位置的值保持为 0。

    • 返回结果数组 result

六、代码执行过程示例

假设我们有 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]

代码执行过程:

  1. 初始化

    • result = [0, 0, 0, 0, 0, 0, 0, 0]

    • stack = []

  2. 遍历温度数组

    • i = 0temperatures[0] = 73

      • stack = [0]

    • i = 1temperatures[1] = 74

      • temperatures[1] > temperatures[0]pre = 0result[0] = 1stack.pop()stack = [1]

    • i = 2temperatures[2] = 75

      • temperatures[2] > temperatures[1]pre = 1result[1] = 1stack.pop()stack = [2]

    • i = 3temperatures[3] = 71

      • stack = [2, 3]

    • i = 4temperatures[4] = 69

      • stack = [2, 3, 4]

    • i = 5temperatures[5] = 72

      • temperatures[5] > temperatures[4]pre = 4result[4] = 1stack.pop()

      • temperatures[5] > temperatures[3]pre = 3result[3] = 2stack.pop()

      • stack = [2, 5]

    • i = 6temperatures[6] = 76

      • temperatures[6] > temperatures[5]pre = 5result[5] = 1stack.pop()

      • temperatures[6] > temperatures[2]pre = 2result[2] = 4stack.pop()

      • stack = [6]

    • i = 7temperatures[7] = 73

      • stack = [6, 7]

  3. 最终结果

    • result = [1, 1, 4, 2, 1, 1, 0, 0]

七、总结

  • 单调栈的作用

    • 单调栈用于处理数组中的顺序问题,特别是找到下一个更大或更小的元素。

  • 栈的维护

    • 栈用于存储温度的索引。

    • 当前温度大于栈顶索引对应的温度时,弹出栈顶索引,并计算索引差值。

  • 结果数组的初始化

    • 结果数组 result 的大小与 temperatures 相同,所有元素初始化为 0。

  • 算法复杂度

    • 时间复杂度:O(n),每个元素最多被压入和弹出栈一次。

    • 空间复杂度:O(n),用于存储结果数组和栈。

http://www.xdnf.cn/news/1251721.html

相关文章:

  • 飞算JavaAI开发平台:重构开发全流程——从需求到工程的智能化跃迁
  • Excel将整列值转换为字符串
  • C语言的数组与字符串练习题1
  • JavaScript DOM 元素节点操作详解
  • MaxKB 使用 MCP 连接 Oracle (免安装 cx_Oracle 和 Oracle Instant Client)
  • 【WAIC 2025】AI安全的攻防前线:合合信息AI鉴伪检测技术
  • kubeadm-k8s 中的 etcd 备份与恢复
  • Minio 高性能分布式对象存储
  • 部署 Zabbix 企业级分布式监控笔记
  • 消息队列的优缺点
  • ubuntu18.04在fstab文件中挂载硬盘失败,系统进入紧急模式的解决方法
  • Ubuntu设置
  • 分布式文件系统07-小文件系统的请求异步化高并发性能优化
  • TCP的拥塞控制
  • CSS :is () 与 :where ():简化复杂选择器的 “语法糖”
  • NodeJs学习日志(1):windows安装使用node.js 安装express,suquelize,sqlite,nodemon
  • 基于Hadoop的股票大数据分析可视化及多模型的股票预测研究与实现
  • 笔试——Day30
  • 如何快速掌握大数据技术?大四学生用Spark和Python构建直肠癌数据分析与可视化系统
  • 【数据结构与算法-Day 12】深入浅出栈:从“后进先出”原理到数组与链表双实现
  • 开疆智能ModbusTCP转Profinet网关连接EPSON机器人配置案例
  • Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水线
  • MATLAB深度学习之数据集-数据库构建方法详解
  • 无人机开发分享——基于行为树的无人机集群机载自主决策算法框架搭建及开发
  • 2025国赛数学建模C题详细思路模型代码获取,备战国赛算法解析——决策树
  • 信息安全概述
  • Dart中回调函数的简单实现
  • NY112NY117美光固态闪存NY119NY123
  • C++之vector类的代码及其逻辑详解 (下)
  • 【Excel】通过Index函数向下拖动单元格并【重复引用/循环引用】数据源