算法题之每日温度

ops/2024/9/23 12:13:33/

每日温度

给定一个整数数组 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的下标,然后从这些元素值中找到最小下标的那个,即为最近的下一个更高的温度

具体代码如下所示:

java">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;}
}

 时间复杂度

  • 时间复杂度:eq?O%28nm%29,其中n为数组temperatures的长度,m是数组next的长度。我们需要反向遍历一遍temperatures,并且遍历一遍数组next。
  • 空间复杂度:eq?O%28m%29,其中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

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

java">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;}
}

 时间复杂度

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

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

 


http://www.ppmy.cn/ops/114768.html

相关文章

单点登录前端

​​​​​​ cookiessession 服务端创建一个登录认证中心&#xff0c; 验证成功后&#xff0c;在session里面创建一个映射&#xff0c;key为cookies&#xff0c;value为用户信息&#xff0c;将cookies返回给客户端&#xff0c;客户端其他系统查询时携带该cookies&#xff0c;…

(182)时序收敛--->(32)时序收敛三二

1 目录 (a)FPGA简介 (b)Verilog简介 (c)时钟简介 (d)时序收敛三二 (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域…

Linux 进程2

环境变量 再Linux操作系统中一切皆文件&#xff0c;这个环境变量自然也是一个文件&#xff0c;它的作用是辅助我们使用操作系统还可以辨识我们是什么用户(一般用户&#xff0c;root用户)。 env是读取完整环境变量的指令&#xff0c;里面记录了许多我登录操作系统所用的用户的信…

Docker FROM 指定基础镜像

所谓定制镜像&#xff0c;其一定是以一个镜像为基础&#xff0c;在其上进行定制。 比如一个 nginx 镜像的容器&#xff0c;再进行修改一样&#xff0c;基础镜像是必须指定的。而 FROM 就是指定基础镜像&#xff0c;因此一个 Dockerfile 中 FROM 是必备的指令&#xff0c;并且必…

使用vite+react+ts+Ant Design开发后台管理项目(一)

前言 本文将引导开发者从零基础开始&#xff0c;运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈&#xff0c;构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导&#xff0c;文章旨在为开发者揭示如何利用这些技术工…

[SAP ABAP] 创建数据库视图和维护视图

数据准备 学校表(ZDBT_SCH_437) 学生表(ZDBT_STU_437) 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)字段 学校表(ZDBT_SCH_437)与学生表(ZDBT_STU_437)行数据明细 1.创建数据库视图 使用SE11创建数据库视图 填写视图名称ZV_DATABASEV_437&#xff0c;点击创建按钮 选择数据库视…

【Canvas与诗词】书愤五首之一 宋.陆游

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金圈银盘</title><style type"text/css">.cen…

Oracle数据库中什么情况下需要使用游标

Oracle数据库中什么情况下需要使用游标&#xff1f; 在数据库操作中&#xff0c;游标是一种重要的工具&#xff0c;用于逐行处理查询结果集。以下是一些需要添加游标的常见场景&#xff1a; **1、逐行处理数据&#xff1a;**当需要对查询结果集进行逐行处理时&#xff0c;如进…