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

每日温度问题:如何高效解决?

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


问题分析

我们需要计算每一天之后需要等多少天才能遇到更高的温度。如果无法找到更高的温度,就返回 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]


解题思路:使用单调栈

在这个问题中,我们要计算每个温度之后,需要多少天才会遇到一个更高的温度。一个直接的暴力解法是,对每一天,从它之后的所有天中查找第一个更高的温度,这样会导致 O(n^2) 的时间复杂度。显然,暴力解法并不高效,特别是对于较大的输入。

为了提高效率,我们可以使用一个单调栈来将时间复杂度降低到 O(n)。下面是具体的思路:

关键步骤:

  1. 从后向前遍历:我们从最后一天开始遍历,每次都试图通过栈来维护一个"待解决"的温度序列。这样可以更容易地通过栈找到每个温度的下一个更高温度。

  2. 维护递减栈:栈中存储的是当前遍历过的温度的索引,并且栈中的温度是递减的。这意味着栈顶的元素对应的温度是当前栈中最小的(即当前最可能成为下一个更高温度的温度)。

  3. 遇到更高温度时计算天数:如果栈顶元素的温度比当前温度低,我们就可以计算该元素的下一个更高温度的天数。

  4. 栈顶小于等于当前温度时,出栈:如果栈顶的温度小于当前温度,那么说明当前温度是下一个更高温度的候选,因此栈顶元素出栈,继续判断下一个栈顶元素。

  5. 栈顶大于当前温度时,计算等待天数:栈顶元素的温度大于当前温度时,说明找到了下一个更高的温度,计算距离当前天数的差。

  6. 压入当前索引:最后,将当前温度的索引压入栈中,准备处理下一个温度。


代码实现:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int n = temperatures.length;int[] ans = new int[n];  // 用来存储每一天之后需要等待的天数Deque<Integer> st = new ArrayDeque<>();  // 单调栈,存储索引// 从后往前遍历for (int i = n - 1; i >= 0; i--) {int t = temperatures[i];  // 当前温度// 维护单调递减栈:移除栈顶比当前温度低的元素while (!st.isEmpty() && t >= temperatures[st.peek()]) {st.pop();  // 弹出栈顶温度比当前低的元素}// 栈不为空,说明有比当前温度更高的温度if (!st.isEmpty()) {ans[i] = st.peek() - i;  // 计算等待天数}// 将当前天的索引压入栈中st.push(i);}return ans;  // 返回结果数组}
}

代码详解:

  1. 栈的作用:栈存储的是温度的索引,而不是温度本身,这样可以方便计算等待天数。

  2. 逆序遍历:从最后一天开始,逐步处理每一天的温度。这是因为我们需要查找每一天之后第一个更高的温度,而如果从前向后遍历就需要不断地返回去查找,效率较低。

  3. 栈的更新:每当我们遇到比栈顶元素小的温度时,栈顶元素的下一次更高温度就是当前温度,计算并记录等待的天数。如果栈顶元素比当前温度大,说明栈顶的温度就是下一个更高温度,记录下来。


时间复杂度分析:

  • 时间复杂度O(n)。每个温度索引最多入栈一次,出栈一次,因此栈的操作总共执行 n 次。

  • 空间复杂度O(n)。我们使用了一个栈来存储索引,最多需要存储 n 个元素。


总结:

通过使用单调栈的技巧,我们能够将时间复杂度从暴力解法的 O(n^2) 优化到 O(n),极大地提升了算法效率。这个方法利用栈来存储待解决的温度索引,并通过栈顶元素的温度与当前温度的比较,快速找到每一天需要等待的天数。


希望这篇文章能够帮助你更好地理解和掌握单调栈的应用技巧!如果你有任何疑问或更好的优化思路,欢迎在评论区留言讨论!

相关文章:

每日温度问题:如何高效解决?

给定一个整数数组 temperatures&#xff0c;表示每天的温度&#xff0c;要求返回一个数组 answer&#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 问题分析 我们需要计算…...

#渗透测试#批量漏洞挖掘#致远互联AnalyticsCloud 分析云 任意文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

统计安卓帧率和内存

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class AnalysisTool : MonoBehaviour { private void Awake() { DontDestroyOnLoad(gameObject); } public Text mmText; // 用于显示FPS的UI …...

大数据学习之PB级百战出行网约车二

21.订单监控_Redis工具类 package com . itbaizhan . utils ; import redis . clients . jedis . Jedis ; import redis . clients . jedis . JedisPool ; import redis . clients . jedis . JedisPoolConfig ; /** * 操作 redis 数据库 62 */ public class Redis…...

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…...

C++病毒(^_^|)(2)

第二期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…...

在vscode中拉取gitee里的项目并运行

拉取项目: 方法一:vscode点击查看--->终端(或者直接通过快捷键ctrol+ `打开) 在终端内通过cd命令定位到你想存放项目的文件夹 例如:cd h: 通过命令:git clone 地址 例如:git clone newbee-mall-vue-app: 前端代码 等待拉取完成即可在对应文件夹下看到项目啦 方…...

centos7 防火墙开放指定端口

在 CentOS 7 中&#xff0c;默认的防火墙管理工具是 firewalld。如果你想开放一个特定的端口&#xff0c;以便允许外部访问&#xff0c;可以通过以下步骤实现&#xff1a; 安装 firewalld 如果你的系统上还没有安装 firewalld&#xff0c;你可以通过以下命令安装&#xff1a; …...

Day42(补)【AI思考】-编译过程中语法分析及递归子程序分析法的系统性解析

文章目录 编译过程中语法分析及递归子程序分析法的系统性解析**一、总览&#xff1a;编译流程中的语法分析****1. 编译过程核心步骤** **二、语法分析的核心任务****1. 核心目标****2. 现实类比** **三、递归子程序分析法的本质****1. 方法分类****2. 递归子程序分析法的运作原…...

AI成为基础设施有哪些研究方向:模型的性能、可解释性,算法偏见

AI成为基础设施有哪些研究方向 模型的性能、可解释性和降低训练成本 伦理问题:算法偏见、数据隐私保护、人工智能的权利和责任 数据使用问题:公开数据已经使用完了,未来使用隐私数据(专家) 当AI成为基础设施后,研究方向将更加多元化和深入,涵盖技术创新、应用拓展、…...

写一个鼠标拖尾特效

思路和逻辑 要实现鼠标拖尾特效&#xff0c;我们需要&#xff1a; 监听鼠标移动事件&#xff0c;获取鼠标的当前位置。在每次鼠标移动时&#xff0c;绘制一个小圆点或其他形状在鼠标的当前位置。将所有绘制的圆点连接起来&#xff0c;形成一条“尾巴”。使用动画效果让尾巴看…...

Redisson介绍和入门使用

一、什么是Redisson&#xff1f; Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务&#xff0c;其中就包含了各种分布式锁的实现。 官网地址…...

OpenAI推出全新AI助手“Operator”:让人工智能帮你做事的新时代!

引言 随着人工智能技术的不断发展&#xff0c;OpenAI 再次推出令人兴奋的功能——Operator&#xff0c;一个全新的 AI 助手平台。这不仅仅是一个普通的助手&#xff0c;它代表了人工智能技术的又一次飞跃&#xff0c;将改变我们工作和生活的方式。 什么是“Operator”&#xff…...

Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)

一、QT与PyQT的概念和特点 1.1、QT QT是一个1991年由The Qt Company开发的跨平台C图形用户界面应用程序开发 框架&#xff0c;可构建高性能的桌面、移动及Web应用程序。也可用于开发非GUI程序&#xff0c;比如 控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代…...

算法笔记 02 —— 入门模拟

本系列为胡凡编著的算法笔记当中代码部分的精简版整理&#xff0c;笔者也在同时准备Leetcode刷题和实习面试&#xff0c;希望为有一定编码和数据结构基础的同学提供一份系统型的参考&#xff0c;以方便遗忘时的算法查阅、期末复习总览以及C学习参照。 目录 01 简单模拟 Ⅰ害…...

PyTorch 源码学习:从 Tensor 到 Storage

分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注 PyTorch 的核心数据结构 Tensor 的设计与实现。因为 PyTorch 不同版本的源码实现有所不同&#xff0c;所以笔者在整理资料时尽可能按版本号升序&#xff0c;版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以&#xff1a; 0. 首先下载鸿蒙字体&#xff1a; 鸿蒙资源 下载后解压&#xff0c;发现里面有几个文件夹&#xff1a; 字体名称说明Sans默认的鸿蒙字体&#xff0c;支持基本的多语言字符&#xff08;包括字…...

LabVIEW多电机CANopen同步

核心问题与解决方案 通信层配置 节点ID与波特率冲突问题&#xff1a;在多电机系统中&#xff0c;节点ID重复或波特率不匹配常导致通信中断或数据丢失。案例&#xff1a;某3轴贴片机因步科驱动器的默认节点ID均为1&#xff0c;触发了总线仲裁错误。解决方案&#xff1a;通过配置…...

每日定投40刀BTC(2)20250209 - 20250212

行路吟 青山叠叠水迢迢&#xff0c; 步履虽艰志未消。 莫问前程几多苦&#xff0c; 长风破浪自逍遥。...

【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串

子串 1. 和为 k 的子数组题目描述解题思路主要思路步骤 时间复杂度与空间复杂度代码实现 2. 滑动窗口最大值题目描述解题思路双端队列的原理&#xff1a;优化步骤&#xff1a; Java实现 3. 最小覆盖子串题目描述解题思路滑动窗口的基本思路&#xff1a;具体步骤&#xff1a;算法…...

国产替代之NVMFS5C673NWFT1G 与 VBQA1615 参数对比报告

N沟道功率MOSFET参数对比分析报告一、产品概述NVMFS5C673NWFT1G&#xff1a;安森美&#xff08;onsemi&#xff09;N沟道功率MOSFET&#xff0c;耐压60V&#xff0c;极低导通电阻&#xff08;10.7mΩ&#xff09;&#xff0c;采用先进沟槽工艺&#xff0c;具有低栅极电荷和电容…...

嵌入式系统安全设计:挑战、原则与微内核实践

1. 嵌入式系统安全的设计挑战与核心原则在万物互联的时代背景下&#xff0c;嵌入式系统已从封闭的独立设备转变为网络化智能节点。这种转变带来了前所未有的安全挑战——根据工业安全机构的统计&#xff0c;2022年针对工业控制系统的网络攻击同比增加了87%&#xff0c;其中针对…...

SAR ADC性能优化:电压基准设计与THD改善方案

1. 电压基准对SAR ADC性能的影响机制在精密数据采集系统设计中&#xff0c;工程师们常常花费大量精力选择高性能的模数转换器(ADC)和优化输入驱动电路&#xff0c;却容易忽视一个关键因素——电压基准的质量及其驱动能力。对于逐次逼近型(SAR)ADC而言&#xff0c;基准电压的稳定…...

基于微信小程序的民宿短租系统(30292)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告/任务书&#xff09;远程调试控屏包运行一键启动项目&…...

New-API数据导出功能:轻松管理AI模型使用记录与账单数据

New-API数据导出功能&#xff1a;轻松管理AI模型使用记录与账单数据 【免费下载链接】new-api A unified AI model hub for aggregation & distribution. It supports cross-converting various LLMs into OpenAI-compatible, Claude-compatible, or Gemini-compatible for…...

【PTA实战】矩阵乘法:从输入格式到核心算法的完整解析

1. 矩阵乘法在PTA平台的核心挑战 第一次在PTA平台做矩阵乘法题时&#xff0c;我被那个"格式卡顿"坑得差点怀疑人生。明明算法逻辑完全正确&#xff0c;提交后却总是提示"格式错误"&#xff0c;这种经历相信很多同学都遇到过。矩阵乘法作为线性代数的基础运…...

怪物猎人世界终极叠加层工具:HunterPie 5分钟快速上手指南

怪物猎人世界终极叠加层工具&#xff1a;HunterPie 5分钟快速上手指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/HunterPi…...

告别马赛克!用MATLAB复刻复古报纸印刷的Bayer抖动算法(附完整代码)

用MATLAB重现复古报纸印刷&#xff1a;Bayer抖动算法的艺术与技术实践 老式报纸上的图片总带着一种独特的粗糙美感——那些由无数小黑点构成的图像&#xff0c;在纸张上呈现出微妙的灰度过渡。这种看似简单的印刷技术背后&#xff0c;隐藏着数字图像处理中一项经典算法&#xf…...

2026最权威的六大降AI率助手实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在把学术成果提交到知网平台以前&#xff0c;针对借助生成式AI辅助而产出的内容去进行合规化…...

技术Leader的困境:为什么你越努力,团队越依赖你?

在软件测试领域&#xff0c;我们比任何角色都更懂“依赖”这个词。测试环境依赖稳定、测试数据依赖真实、测试用例依赖需求文档。但有一种依赖&#xff0c;最致命却也最容易被忽视——团队对你的依赖。很多从一线测试骨干晋升为测试Leader的人&#xff0c;都会陷入一个怪圈&…...