当前位置: 首页 > 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.dtcms.com/a/317335.html

相关文章:

  • LeetCode 91~110题解
  • Java 大视界 -- 基于 Java 的大数据实时流处理在工业物联网设备故障预测与智能运维中的应用(384)
  • 自动驾驶系统的网络安全风险分析
  • 力扣经典算法篇-45-回文数(数字处理:求余+整除,字符串处理:左右指针)
  • 【2025.08.06最新版】Android Studio下载、安装及配置记录(自动下载sdk)
  • Java 使用动态代理和反射实现字段变更跟踪
  • 一种基于潜在表征的轻量级无人机热成像超分辨率网络
  • Linux systemd 系统管理:systemctl 控制服务与守护进程
  • Redis集群核心原理与实战解析
  • Pytest项目_day04(Python做接口请求)
  • PyTorch生成式人工智能(26)——使用PyTorch构建GPT模型
  • 语言模型的多个agent
  • Java学习第一百一十部分——CI/CD
  • 输电线路防外破声光预警装置 | 防山火/防钓鱼/防施工安全警示系统
  • vue中reactive()和ref()的用法
  • FluentUI的介绍与使用案列
  • 组合期权:股票担保策略
  • Suno API V5模型 python源码 —— 使用灵感模式进行出创作
  • 从原理图到PCB的布局
  • 优选算法1
  • 学习资料推荐
  • 商用音乐素材获取:素材平台、AI制作与版权考量
  • 如何将照片从POCO手机传输到Mac电脑
  • OpenAI GPT-OSS:首个可在笔记本上运行的推理模型
  • 科技云报到:Agent应用爆发,谁成为向上托举的力量?
  • 微算法科技(NASDAQ:MLGO)利用鸽群分散算法,提高区块链交易匹配算法效能
  • 【博客系统UI自动化测试报告】
  • 【递归完全搜索】USACO Bronze 2019 December - 奶牛排列Livestock Lineup
  • 每日算法刷题Day57:8.6:leetcode 单调栈6道题,用时2h
  • 【前端开发】五. ES5和ES6对比