当前位置: 首页 > 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.lryc.cn/news/611582.html

相关文章:

  • 分布式存储 Ceph 的演进经验 · SOSP 2019
  • 从零搭建React框架--第一章:create-react-app、antd、less
  • 深度解析|资源位管理工具如何重构媒体商业化效率?
  • 《算法导论》第 8 章—线性时间排序
  • 福彩双色球第2025090期篮球号码分析
  • 【STL源码剖析】从源码看 vector:底层扩容逻辑与内存复用机制
  • Python实现信号小波分解与重构
  • 飞算JavaAI开发平台:重构开发全流程——从需求到工程的智能化跃迁
  • 数据大集网:以数据为纽带,重构企业贷获客生态的助贷平台实践
  • React 表单处理:移动端输入场景下的卡顿问题与防抖优化方案
  • WebSocket 通信与 WebSocketpp 库使用指南
  • Baumer相机如何通过YoloV8深度学习模型实现农作物水稻病虫害的检测识别(C#代码UI界面版)
  • 深度学习-卷积神经网络CNN-多输入输出通道
  • 2025年大语言模型与多模态生成工具全景指南(V2.0)
  • 《动手学深度学习》读书笔记—9.3深度循环神经网络
  • MCU程序段的分类
  • 如何解决网页视频课程进度条禁止拖动?
  • Linux入门DAY18
  • MCU控制ADAU1701,用System Workbench for STM32导入工程
  • SSL/TLS协议深度解析
  • react 流式布局(图片宽高都不固定)的方案及思路
  • 【Create my OS】8 文件系统
  • 机器学习第六课之贝叶斯算法
  • 《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解
  • 新能源汽车热管理系统核心零部件及工作原理详解
  • apache-tomcat-11.0.9安装及环境变量配置
  • 【算法训练营Day21】回溯算法part3
  • Redis的分布式序列号生成器原理
  • 【C++详解】STL-set和map的介绍和使用样例、pair类型介绍、序列式容器和关联式容器
  • 部署 Zabbix 企业级分布式监控笔记