[每日算法 - 阿里机试] leetcode739. 每日温度

入口

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/daily-temperatures/description/

题目描述

给定一个整数数组 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

方法一:暴力法

        该算法使用两个嵌套循环,对于每一天,它都会遍历后续的天数来查找第一个温度升高的日子。测试集足够大时,此方法在leetcode中会超出时间限制。

Java实例

class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] res = new int[temperatures.length]; // 用于存储结果的数组for (int i = 0; i < temperatures.length; i++) {int temp = 0; // 用于记录等待的天数for (int j = i+1; j < temperatures.length; j++) {if (temperatures[j] > temperatures[i]) {temp = j - i; // 如果找到升高的温度,则计算等待的天数break; // 跳出内层循环,因为已经找到了升高的温度}}res[i] = temp; // 将等待的天数存储在结果数组中}return res; // 返回结果数组}
}

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是温度数组的长度。因为对于每一天,最坏情况下需要遍历数组的其余部分来找到温度升高的日子。
  • 空间复杂度:O(1),只使用了常量级的额外空间。

方法二:暴力法改进-辅助数组

        该方法是暴力法的改进方法,其核心思想是利用辅助数组 next 来记录每个温度后面出现的更高温度的索引位置,从而避免了嵌套循环。

辅助数组 next: 这个数组的索引表示温度值,数组中的值表示该温度值在原数组中出现的索引位置。初始化为最大值,表示当前温度后面没有更高的温度。

逆序遍历原数组: 从数组末尾开始向前遍历,这是因为我们需要找的是每个温度后面第一次出现的更高温度,逆序遍历可以确保我们从后往前找到更高温度。

查找更高温度的索引: 对于每个温度,我们不需要遍历其后面的所有温度,而是直接查找辅助数组 next 中大于当前温度的最小索引值,即下一个更高温度的索引。

通过这种方法,我们只需要一次遍历原数组,时间复杂度为 O(n),大大提高了效率。

Java示例

    public static int[] dailyTemperatures(int[] temperatures) {int length = temperatures.length;int[] ans = new int[length]; // 用于存储结果的数组int[] next = new int[101]; // 辅助数组,用于存储下一个更暖和的温度的索引// 初始化辅助数组为最大值,表示没有更暖和的温度Arrays.fill(next, Integer.MAX_VALUE);// 从数组末尾开始遍历for (int i = length - 1; i >= 0; --i) {int warmerIndex = Integer.MAX_VALUE; // 用于记录下一个更暖和的温度的索引, 初始值设为 Integer.MAX_VALUE,表示初始情况下没有更高温度。// 遍历当前温度之后的所有可能温度,最高温度不会超过 100for (int t = temperatures[i] + 1; t <= 100; ++t) {if (next[t] < warmerIndex) { //找到了比当前温度更高的温度,并且它的索引比之前记录的更高温度索引还要小,就更新 warmerIndex。这样,warmerIndex 就始终记录着当前温度后面第一次出现更高温度的索引位置。warmerIndex = next[t];   // 找到下一个更暖和的温度的索引}}// 如果找到了更暖和的温度,则计算等待的天数if (warmerIndex < Integer.MAX_VALUE) {ans[i] = warmerIndex - i;}// 更新辅助数组,将当前温度的索引存储在相应的位置next[temperatures[i]] = i;}return ans; // 返回结果数组}

复杂度分析

  • 时间复杂度:O(nm),其中 n 是温度列表的长度,m 是数组 next 的长度,在本题中温度不超过 100,所以 m 的值为 100。反向遍历温度列表一遍,对于温度列表中的每个值,都要遍历数组 next 一遍。
  • 空间复杂度:O(m),其中 m 是数组 next 的长度。除了返回值以外,需要维护长度为 m 的数组 next 记录每个温度第一次出现的下标位置。

方法三:单调栈

​​​​​​​

import java.util.Deque;
import java.util.LinkedList;class Solution {public int[] dailyTemperatures(int[] temperatures) {// 创建一个数组用于存储结果,长度与温度数组相同int[] ans = new int[temperatures.length];// 创建一个栈用于存储温度数组的索引Deque<Integer> stack = new LinkedList<>();// 遍历温度数组for(int i = 0; i < temperatures.length; ++i){// 如果栈不为空并且当前温度大于栈顶温度while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]){// 弹出栈顶索引,计算等待天数并记录到结果数组中int preIndex = stack.pop();ans[preIndex] = i - preIndex;}// 将当前索引入栈stack.push(i);}// 返回结果数组return  ans;}
}

时间复杂度:O(n),其中 nnn 是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

空间复杂度:O(n)O,其中 nnn 是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

单调栈练习题
leetcode496.下一个更大元素1
leetcode901.股票价格跨度
leetcode42.接雨水
leetcode84.柱状图中最大的矩形

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安装charles抓包iphone

安装charles抓包iphone charles基础介绍windows安装 charles基础介绍 Charles 是在 PC 端常用的网络封包截取工具&#xff0c;在做移动开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要截取网络封包来分析。除了在做移动开发中调试端口外&#xf…

不允许在constexpr函数中进行声明

这是我用pycharm在windows系统下复现sfm深度学习网络(Deep Two-View Structure-from-Motion Revisited&#xff09;遇见的问题&#xff0c;复现时有段代码pytorch扩展cuda/c&#xff0c;pycharm中出现C标准相关的报错如下&#xff1a; 在网上查找很久无果&#xff0c;后面通过…

nginx配置实例-高可用主备模式

目录 什么是高可用&#xff1f; 解决的问题&#xff1f; 双机热备方案 keepalived是什么&#xff1f; 故障转移机制 环境准备 一、实现过程 1.1安装keepalived 安装好以后&#xff0c;将keepalived程序开启&#xff0c;并且加入到开机启动项中 1.2修改主机&#xff08;…

winform入门篇3 -- 手工创建窗口

手工创建窗口 Form, 窗口 可以手工创建一个窗口类 class MyFrom : Form { } 1.创建一个windows 窗体应用 这样就自动创建了一个窗体应用Form1 现在不使用这个自动创建的&#xff0c;手工写一个 2.手动创建 1.删除Form1.cs 2.添加 新建MyForm 类 让该类继承Form 在构造…

Covalent Network(CQT)推出以太坊质押迁移计划,以增强长期结构化数据可用性、塑造万亿级 LLM 参数体系

作为 Web3 领先的链上数据层&#xff0c;Covalent Network&#xff08;CQT&#xff09;宣布了其将质押操作从 Moonbeam 迁移回以太坊的决定。此举是 Covalent Network&#xff08;CQT&#xff09;走向以太坊时光机&#xff08;EWM&#xff09;的第一步&#xff0c;EWM 是一个为…

Python | 超前滞后分析

Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋&#xff0c;所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常&#xff0c;异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…

golang代码练习样例模版--推荐--测试学习使用的方法

golang代码练习样例模版 以前用的python代码&#xff0c;每次测试都是一个python文件&#xff0c;但是go就是以文件夹为目录为 结构的测试&#xff08;同一个文件夹下&#xff0c;不能有同名的函数&#xff09; 大部分时间就是测试&#xff0c;如何对go程序函数进行测试&#…

【java工具-灵活拉取数据库表结构和数据】

需求&#xff1a; 假设我们现在有一个需求&#xff0c;需要快速拉取数据库的某些表建表语句&#xff0c;和数据&#xff0c;平时做备份之类&#xff1b; 我这边自己写了个工具&#xff0c;不多废话&#xff0c;也不整虚的&#xff0c; 直接看代码&#xff1a; package com.…

GitLab教程(一):安装Git、配置SSH公钥

文章目录 序一、Git安装与基本配置&#xff08;Windows&#xff09;下载卸载安装基本配置 二、SSH密钥配置 序 为什么要使用代码版本管理工具&#xff1a; 最近笔者确实因为未使用代码版本管理工具遇到了一些愚蠢的问题&#xff0c;笔者因此认为代码版本管理工具对于提高团队…

JR-SMD201-P便携式网络解码器

详细介绍&#xff1a; JR-SMD201-P便携式网络解码器采用1/2U设计&#xff0c;支持AVS/H.265/H.264/MPEG2解码&#xff0c;支持IP输入&#xff0c;支持1080P/1080I/720P/576I/480I多种分辨率&#xff0c;支持DRA/AC3/EAC3/AAC/MPEG等音频。 产品特点 支持输入方式IP 接口丰富&a…

户外骑行存档(图新地球与运动健康App)经验分享

0序 之前天天加班熬夜&#xff0c;身体素质有些下降&#xff0c;在锻炼的过程中喜欢上了骑行&#xff0c;周周骑、天天骑。 骑行会产生很多的轨迹&#xff08;有很多朋友不喜欢装很多app&#xff0c;就用手机自带的运动健康&#xff0c;也有喜欢专业运动app的&#xff0c;道理…

SQL注入原理与信息获取及常规攻击思路靶场实现

SQL注入原理与信息获取及常规攻击思路靶场实现 很早的时候就写了&#xff0c;权当备份吧 Web程序三层架构 表示层 &#xff1a;与用户交互的界面 , 用于接收用户输入和显示处理后用户需要的数据 业务逻辑层 &#xff1a;表示层和数据库访问层之间的桥梁 , 实现业务逻辑 ,验证、…

BPMN.JS中文教程学习

基础篇 vue bpmn.js 建模BpmnModeler将数据转图形bpmnModeler.importXML // basic.vue<script>// 引入相关的依赖import BpmnModeler from bpmn-js/lib/Modelerimport {xmlStr} from ../mock/xmlStr // 这里是直接引用了xml字符串export default {name: ,components: {…

三维点云:对原始点云数据进行体素化

文章目录 一、原始点云二、对原始点云进行体素化三、结果展示 一、原始点云 &#x1f349;原始点云为.pts文件&#xff0c;内容为x, y, z的坐标 原始点云展示 二、对原始点云进行体素化 使用open3d库实现&#xff0c;如果没有需要在命令行执行pip install open3d import o…

vue vue3 手写 动态加载组件

效果展示 一、需求背景&#xff1a; # vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件 二、实现思路 通过一个加载状态变量&#xff0c;通过v-if判断&#xff0c;加载状态的变量等于哪一个&#xff0c;动态加载组件内部就显示的哪一块组件。 三、实现效果…

安装Schedule库的方法最终解答!_Python第三方库

安装Python第三方库Schedule 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Schedule库 Schedule 是一个轻量级、功能强大而灵活的任务调度工具库&#xff0c;用于在指定的时间间隔内执行任务。为用户提供了简单易用的…

kali使用msf+apkhook520+cploar实现安卓手的攻击

学习网络安全的过程中&#xff0c;突发奇想怎么才能控制或者说是攻击手机 边找工作边实验 话不多说启动kali 一、使用msfapktool生成简单的木马程序 首先使用kali自带的msfvenom写上这样一段代码 选择安卓 kali的ip 一个空闲的端口 要输出的文件名 msfvenom -p android/met…

kafka(五)——消费者流程分析(c++)

概念 ​ 消费者组&#xff08;Consumer Group&#xff09;&#xff1a;由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据&#xff0c;一个分区只能由一个组内消费者消费&#xff1b;消费者组之间互不影响。所有的消费者都属于某个消费者组&#xff0c;即消费者…

今日arXiv最热大模型论文:Dataverse,针对大模型的开源ETL工具,数据清洗不再难!

引言&#xff1a;大数据时代下的ETL挑战 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加&#xff0c;尤其是在大语言模型&#xff08;LLMs&#xff09;的开发中&#xff0c;对海量数据的需求呈指数级增长。这种所谓的“规模化法则”表明&#xff0c;LLM的性…

HTML - 请你说一下如何阻止a标签跳转

难度级别:初级及以上 提问概率:55% a标签的默认语义化功能就是超链接,HTML给它的定位就是与外部页面进行交流,不过也可以通过锚点功能,定位到本页面的固定id区域去。但在开发场景中,又避免不了禁用a标签的需求,那么都有哪些方式可以禁用…