算法题之每日温度

每日温度

给定一个整数数组 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 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

解题思路一:反向遍历

一看到题目,要找到下一个更高的温度,首先马上想到可以反向遍历。因为倒序的时候, 可以保证,如果有比当前温度大的下一个温度,一定会在遍历过的元素里。最重要的是,我们需要记录下来已经遍历过的元素。

然后我们看数组的元素的规律,温度的范围在30到100之间 。所以,我们可以维护一个101长度的数组next,温度为30至100度,作为数组的下标,元素设置为数组temperatures的下标。

  • 维护的数组next,我们初始化元素值为Integer.MAX_VALUE
  • 反向遍历数组temperatures,设置当前温度的next元素值为数组temperatures的下标
  • 当前温度+1的位置开始,正向遍历数组next,找到元素值小于Integer.MAX_VALUE的值;这个值就是temperatures的下标,然后从这些元素值中找到最小下标的那个,即为最近的下一个更高的温度

具体代码如下所示:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int [] ans = new int[temperatures.length];int [] next = new int[101];Arrays.fill(next, Integer.MAX_VALUE);for (int i = temperatures.length - 1; i >= 0; i--) {int temperature = temperatures[i];ans[i] = 0;next[temperature] = i;int nextTemperatureIndex = Integer.MAX_VALUE;for (int j = temperature + 1; j < 101; j++) {if (next[j] < nextTemperatureIndex) {                    nextTemperatureIndex = next[j];}}if (nextTemperatureIndex < Integer.MAX_VALUE) {ans[i] = nextTemperatureIndex - i;}}return ans;}
}

 时间复杂度

  • 时间复杂度:O(nm),其中n为数组temperatures的长度,m是数组next的长度。我们需要反向遍历一遍temperatures,并且遍历一遍数组next。
  • 空间复杂度:O(m),其中m 是数组next的长度。

 解题思路二:单调栈

在上面的方法中,我们是通过反向遍历数组temperatures,然后再在额外的数组next中找到最小下标的。那么我们可以换一种数据结构存储温度的下标,提高效率么?

首先,我们来看,如果正向地遍历数组temperatures

  1. 遍历第1个元素的时候,我们记录下来下标0
  2. 遍历第2个元素,我们比较第temperatures[0]和temperatures[1]
  3. 如果temperatures[1]比temperatures[0]大,那么答案ans[0]= 1 - 0 = 1,并且我们就不用记录下标0了,转而记录下标1
  4. 如果temperatures[0]比temperatures[1]大,那么不能确定答案,并且我们还要记录下标1,然后继续下后面遍历,如果能找到下标i(i > 1),依次和下标1、下标0的温度值比较
  5. 如果temperatures[i]比temperatures[1]大,ans[1] = i - 1,并且我们移除记录的下标1;然后和下标0比较,具体类似步骤3、4

按照上面的步骤操作,我们会发现,可以额外用一个栈来记录下标,并且记录的下标对应的温度值,从栈底到栈顶,是依次递减的。每次遍历发现,当前遍历的温度值大于栈内下标对应的温度值时,可以依次弹栈并记录结果。具体代码如下所示:

class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] ans = new int[temperatures.length];Deque<Integer> stack = new LinkedList<Integer>();// Stack<Integer> stack = new Stack<>();for(int i = 0; i < temperatures.length; i++){while(stack.isEmpty() == false && temperatures[stack.peek()] < temperatures[i]){int pre = stack.pop();ans[pre] = i - pre;}stack.push(i);}return ans;}
}

 时间复杂度

  • 时间复杂度:O(n),我们需要正向遍历一遍temperatures,并且每个下标出入栈只有一次。
  • 空间复杂度:O(n),需要使用栈,最坏的情况下为n。

在实际使用中,发现使用Stack的效率较低,时间复杂度甚至高于反向遍历;当我们使用LinkedList的时候,效率是正常的。如果有兴趣,可以看看Stack和LinkedList的源码分别是怎么实现出栈入栈的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147536.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕设课设—企业车辆管理系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—企业车辆管理系统(附源码、文章、相关截图、部署视频) 企业车辆管理系统通过计算机&#xff0c;能够直接“透视”车辆使用情况&#xff0c;数据计算自动完成&#xff0c;尽量减少人工干预&#xff0c;可…

Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+源码+数据库)

目录 目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着…

实战指南:深度剖析Servlet+JSP+JDBC技术栈下的用户CRUD操作

本博客总结基于MVC(JSPServletJDBC)操作用户信息的CRUD&#xff08;增删改查功能&#xff09;的完整小项目。包括图片上传和回显&#xff0c;模糊查询&#xff0c;过滤器的登录校验和设置全局字符集以及监听器统计在线用户人数等额外功能&#xff0c;因为代码较多&#xff0c;我…

UnLua实现继承

一、在蓝图中实现继承 1、创建父类&#xff0c;并绑定Lua脚本 2、创建子类蓝图&#xff0c;如果先创建的子类&#xff0c;可以修改父类继承 注意&#xff0c;提示选择继承父类的接口&#xff01; 二、在Lua中实现继承 1、在父类Lua脚本中实现函数 BP_CharacterBase.lua func…

构建数字化生态系统:打造数字化转型中开放协作平台的最佳实践和关键实施技巧

在数字化转型浪潮中&#xff0c;企业如何确保成功实施至关重要。除了技术上的革新&#xff0c;企业还必须在战略执行、架构优化以及合规性管理等方面掌握最佳实践。随着云计算、大数据、人工智能等新兴技术的迅速发展&#xff0c;企业通过正确的实施技巧不仅能提升业务效率&…

Qemu开发ARM篇-3、qemu运行uboot演示

文章目录 1、运行uboot2、qemu常用命令 在上一篇Qemu开发ARM篇-2、uboot交叉编译文章中&#xff0c;我们搭建了交叉编译工具链&#xff0c;并成功进行了uboot的交叉编译&#xff0c;在该篇中&#xff0c;我们将演示如何利用qemu运行上一篇中交叉编译的uboot程序。 1、运行uboo…

计算机毕业设计之:基于微信小程序的学生考勤系统的设计与实现(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Redis——redispluspls库hash及zset类型相关接口使用

文章目录 hash类型相关接口hset和hgethexistshdelhkeys 和 hvalshmset和hmget zset类型相关接口zadd和zrangezcard 和 zremzscore和zrank hash类型相关接口 hset和hget std::cout<<"hset 和 hget"<<std::endl;redis.flushall();redis.hset("key&qu…

Java 分布式锁:原理与实践

在分布式系统中&#xff0c;多个节点同时操作共享资源的情况非常普遍。为了保证数据的一致性&#xff0c;分布式锁 应运而生。分布式锁 是一种跨多个服务器的互斥锁&#xff0c;用于协调分布式环境下的资源访问。 本文将介绍 Java 实现分布式锁 的几种常见方式&#xff0c;并结…

OpenAI API: How to catch all 5xx errors in Python?

题意&#xff1a;OpenAI API&#xff1a;如何在 Python 中捕获所有 5xx 错误&#xff1f; 问题背景&#xff1a; I want to catch all 5xx errors (e.g., 500) that OpenAI API sends so that I can retry before giving up and reporting an exception. 我想捕获 OpenAI API…

浙大数据结构:05-树8 File Transfer

数据结构MOOC PTA习题 这道题考察并查集的操作&#xff0c;合并以及找根结点 机翻&#xff1a; 1、条件准备 node是数组存放1-N结点的根节点的&#xff0c;n为总结点数 #include <iostream> using namespace std;const int N 1e4 5; int node[N]; int n; 先初始化…

<<编码>> 第 16 章 存储器组织(3)--3-8 译码器 示例电路

3-8 译码器 info::操作说明 “写入” 开关先断开(Q 为低电平, 表示不写入) S2-S1-S0 设置一个二进制数, 选中 Q0~Q7 其中一个作为 Q 的输出 “数据输入” 端置入要保存的数(0或1) 闭合 “写入” 开关, 对应的一位锁存器中的 W 为高电平, 表示可以写入, “数据输入” 的值最终…

嵌入式常用GUI介绍

目录 前言一、GuiLite二、LVGL三、SimpleGUI四、MiniGUI五、emWin六、TouchGFX七、uGUI八、GFX九、Embedded Wizard十、CrankSoftware十一、PEG Graphics Software十二、Guiliani十三、MPLAB Harmony Graphics Suite 前言 图形用户界面&#xff08;Graphical User Interface&am…

关系数据库设计之Armstrong公理详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、Armstrong公理简介 Armstrong公理是一组在关系数据库理论中用于推导属性依赖的基本规则。这些公理是以著名计算机科学家威廉阿姆斯特朗&…

优化内存工具 | RAM Saver Pro v24.9 便携版

RAM Saver是一款专业的RAM优化工具&#xff0c;旨在提高计算机的性能和运行速度。它通过多种优化技术&#xff0c;如内存碎片整理、CPU和主板缓存效率提升、恢复内存等&#xff0c;为应用程序提供更多的内存资源&#xff0c;从而使系统运行更加流畅。适合所有需要优化内存使用和…

EMT-LTR--学习任务间关系的多目标多任务优化

EMT-LTR–学习任务间关系的多目标多任务优化 title&#xff1a; Learning Task Relationships in Evolutionary Multitasking for Multiobjective Continuous Optimization author&#xff1a; Zefeng Chen, Yuren Zhou, Xiaoyu He, and Jun Zhang. journal&#xff1a; IEE…

银河麒麟V10系统崩溃后的处理

银河麒麟V10系统崩溃后的处理 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 当银河麒麟桌面操作系统V10崩溃无法启动时&#xff0c;直接使用备份还原工具不可行。此时&#xff0c;应采取以下步骤&#xff1a; 进入救援模式或LiveCD&#x…

攻防世界---->Windows_Reverse1

学习笔记。 前言&#xff1a;不会&#xff0c;代码越简洁&#xff0c;越难受 T ^ T 下载 查壳。 UPX脱壳。 此题脱壳后的程序&#xff0c;是不能运行的。 网上wp&#xff0c;说是因为作者采用了ASLR(地址随机化) 解决方法&#xff1a;一&#xff1a;用XP运行调试。 方法二&a…

0基础跟德姆(dom)一起学AI 数据处理和统计分析05-Pandas数分入门

* DataFrame读写文件 * DataFrame加载部分数据 * DataFrame分组聚合计算 * DataFrame常用排序方式 * DataFrame案例-链家数据分析 --- 1.DataFrame-保存数据到文件 * 格式 python df对象.to_数据格式(路径) # 例如: df.to_csv(data/abc.csv) * 代码演示 > 如…

Deepin man 没有关于printf 的手册页条目

问题 man 3 printf&#xff1a;在第 3 节中没有关于 printf 的手册页条目。 解决方法&#xff1a;安装manpages发开库。 搜索包 apt search manpages安装 sudo apt install manpages-dev若没有manpages-dev&#xff0c;安装manpages-posix-dev&#xff0c;应该也可以&#x…