( 栈和队列) 739. 每日温度 ——【Leetcode每日一题】

news2024/12/29 11:18:51

❓739. 每日温度

难度:中等

给定一个整数数组 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 < = t e m p e r a t u r e s . l e n g t h < = 1 0 5 1 <= temperatures.length <= 10^5 1<=temperatures.length<=105
  • 30 <= temperatures[i] <= 100

💡思路:

法一:暴力

大多数人看到该题目的第一思路可能就是暴力求解,即对每个数都往后一个一个查找,直到找到比当前数大的为止;

我们可以再多想一步,能否利用前面的搜索信息,从而降低搜索量,这时我们就可以从后往前遍历该数组:

  • 除了最后一个元素外,对每元素都先和紧接该元素之后的比较,如果后一个元素大于当前元素,我们就找到了下一个最高温度,结果保存为1(这也是我们最希望处理的);
  • 如果紧接该元素i之后的元素小于等于当前元素,那么我们就查找紧接该元素之后的元素的下一个更高温度(因为我们是从后往前遍历,所以后面的结果我们都已经得到。)直到找到比i更高温度,或者找到最后都没有,则结果为0

法二:单调栈

观察发现,我们要找的结果,可以由数组的索引获得,如果这一天的温度比前一天的温度高,前一天的结果就等于这一天的数组索引减去前一天的数组索引,结果为1

  • 所以我们可以利用栈,保存数组索引,如果当前索引的温度,高于栈顶索引对应的温度,则栈顶索引处的结果ans[indexs.top()]就等于当前索引curIndex 减去 栈顶索引值indexs.top(),然后出栈,再和栈顶比较,直到不高于栈顶索引对应的温度;
  • 如果不高于栈顶索引对应的温度,则当前索引curIndex 入栈;

🍁代码:(Java、C++)

法一:暴力
Java

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
		int[] ans = new int[n];
		ans[n - 1] = 0;
		for (int i = n - 2; i >= 0; i--) {
			if (temperatures[i] < temperatures[i + 1]) {
				ans[i] = 1;
			}
			else {
				int j = i + 1;
				ans[i] = 1 + ans[j];
				j += ans[j];
				while (j < n) {
					if (temperatures[i] < temperatures[j]) {
						break;
					}else if (temperatures[i] >= temperatures[j] && ans[j] != 0) {
						ans[i] += ans[j];
						j += ans[j];
					}
					else{
						ans[i] = 0;
						break;
					}
				}
			}
		}
		return ans;
    }
}

C++

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
		vector<int> ans(n);
		ans[n - 1] = 0;
		for (int i = n - 2; i >= 0; i--) {
			if (temperatures[i] < temperatures[i + 1]) {
				ans[i] = 1;
			}
			else {
				int j = i + 1;
				ans[i] = 1 + ans[j];
				j += ans[j];
				while (j < n) {
					if (temperatures[i] < temperatures[j]) {
						break;
					}else if (temperatures[i] >= temperatures[j] && ans[j] != 0) {
						ans[i] += ans[j];
						j += ans[j];
					}
					else{
						ans[i] = 0;
						break;
					}
				}
			}
		}
		return ans;
    }
};

法二:单调栈
Java

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] dist = new int[n];
        Stack<Integer> indexs = new Stack<>();
        for (int curIndex = 0; curIndex < n; curIndex++) {
            while (!indexs.isEmpty() && temperatures[curIndex] > temperatures[indexs.peek()]) {
                int preIndex = indexs.pop();
                dist[preIndex] = curIndex - preIndex;
            }
            indexs.add(curIndex);
        }
        return dist;
    }
}

C++

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
		vector<int> ans(n);
		stack<int> indexs;
		for (int curIndex = 0; curIndex < n; curIndex++) {
			while (!indexs.empty() && temperatures[curIndex] > temperatures[indexs.top()]) {
				ans[indexs.top()] = curIndex - indexs.top();
				indexs.pop();
			}
			indexs.push(curIndex);
		}
		return ans;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。暴力法小于 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n ) O(n) O(n),其中 n 是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

32k*16 薪,3年自动化测试历经3轮面试成功拿下华为Offer....

前言 转眼过去&#xff0c;距离读书的时候已经这么久了吗&#xff1f;&#xff0c;从18年5月本科毕业入职了一家小公司&#xff0c;到现在快4年了&#xff0c;前段时间社招想着找一个新的工作&#xff0c;前前后后花了一个多月的时间复习以及面试&#xff0c;前几天拿到了华为…

Java并发编程 —— ThreadPoolExecutor线程池详解

一、什么是线程池 线程池是一种池化技术&#xff0c;是管理一系列线程的资源池。当有任务要处理时&#xff0c;直接从线程池中获取线程来处理&#xff0c;处理完之后线程并不会立即被销毁&#xff0c;而是等待下一个任务。这样实现线程的复用&#xff0c;避免重复创建与销毁线…

司美格鲁肽进入临床竞速期,减肥“神药”生于偶然、火于乱象?

减肥作为一门市场需求旺盛的生意&#xff0c;在很多行业都有所渗透&#xff0c;如今其高潮逐渐来到了医药领域。 CDE&#xff08;国家食品药品监督管理局药品审评中心&#xff09;网站显示&#xff0c;4月17日&#xff0c;联邦制药全资附属公司联邦生物科技&#xff08;珠海横…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷&#xff0c;Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具&#xff0c;设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大&#xff0c;因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…

【Leetcode -19.删除链表的倒数第N个结点 -24.两两交换链表中的节点】

Leetcode Leetcode -19.删除链表的倒数第N个结点Leetcode - 24.两两交换链表中的节点 Leetcode -19.删除链表的倒数第N个结点 题目&#xff1a;给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;he…

软件测试人员在工作中如何运用Linux

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事&#xff0c;工作时需要用到&#xff0c;面试时会被问到&#xff0c;简历中需要写到。 对于软件测试人员来说&#xff0c;不需要你多么熟练使用Linux所有命令&#xff0c;也不需要你对Linux系统完全了解&#xff…

vue总线bus的使用和移除注意事项

vue总线bus的使用和移除注意事项 本文目录 vue总线bus的使用和移除注意事项初始化并封装发送事件接收事件移除事件监听实际使用正确测试效果错误测试效果 初始化并封装 在main.js中对bus进行初始化&#xff0c; Bus是一个不具备 DOM 的组件&#xff0c;它具有的仅仅只是它实例…

算法 | 最长回文子串

思路&#xff1a;遍历字符串&#xff0c;对于字符串的每个字符&#xff0c;维持两个游标&#xff08;left&#xff0c;right&#xff09;&#xff0c;找到游标对应字符相等时就同速度向两边扩散。 对于 奇数长度子串&#xff0c;left right 对于偶数成都子串&#xff0c;lef…

RocketMq消息

消息发送 发送同步消息 public class SyncProducer {public static void main(String[] args) throws Exception{DefaultMQProducer producernew DefaultMQProducer(/*please_rename_unique_group_name*/"group1");producer.setNamesrvAddr("localhost:9876&q…

复现Nginx 解析漏洞

目录 漏洞原理 漏洞复现 编译环境 制作图片马 一&#xff1a;随便弄一张图片 二&#xff1a;准备写一个.php文件&#xff0c;写上木马 三&#xff1a;合成图片马 上传图片马 修复漏洞 漏洞原理 1、 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fast…

一篇文章告诉你金融行业如何高效管理文件

由于金融行业的行业属性&#xff0c;信息安全万分重要。因此在文件管理工具时&#xff0c;要注意数据安全问题&#xff0c;那么金融行业如何高效管理文件呢&#xff1f; 首先金融行业在文件管理时可能面临以下问题&#xff1a; 1&#xff0c;资料繁杂&#xff0c;整理困难&…

Unity Camera -- (3)控制相机能看到的东西

使用剪裁平面&#xff08;Clipping Planes&#xff09;定义相机可视范围 Clipping Planes定义了相机所能看到的场景范围。在有些时候&#xff0c;限制相机所能看到的范围是出于风格上的考量&#xff0c;但编辑Clipping Planes的主要目的是为了优化性能。相机所需要渲染的东西越…

什么是低码平台?低代码平台能解决什么问题?

低代码平台是近年来日益流行的一种新型软件开发工具。它们提供了一种更简单、更快速、更具成本效益的方式来构建和部署定制软件应用程序。在本文中&#xff0c;我们将探讨什么是低码平台&#xff0c;它们可以解决什么问题&#xff0c;以及它们为什么变得如此流行。 一、什么是低…

第十六章 命令模式

文章目录 前言一、命令模式解决智能生活项目设计思想完整代码Command 所有命令的父接口&#xff08;绑定命令都需要实现&#xff09;LightReceiver 命令接受者LightOnCommand / LightOffCommand 将具体的命令进行绑定空命令命令调用者Clint 测试 添加新的命令&#xff0c;非常简…

【信息安全案例】——身份与访问安全(学习笔记)

&#x1f4d6; 前言&#xff1a;一位用户对计算机信息资源的访问活动中&#xff0c;首先必须拥有身份标识&#xff0c;通过该标识鉴别该用户的身份&#xff0c;进一步地&#xff0c;用户还应当具有执行所请求动作的必要权限&#xff0c;系统会验证并控制其能否执行对资源试图完…

Human Pose Regression with Residual Log-likelihood Estimation

Abstract 通过似然热图对输出分布进行建模的基于热图的方法在人体姿态估计领域占据主导地位。相比之下&#xff0c;基于回归的方法更有效&#xff0c;但效果较差。 在这项工作中&#xff0c;我们探索了最大似然估计&#xff08;MLE&#xff09;&#xff0c;以开发一种高效有…

基于朴素贝叶斯的垃圾邮件分类系统项目开发教程

项目资源下载 基于朴素贝叶斯的垃圾邮件分类系统源码 项目简介 本项目基于朴素贝叶斯算法来解决垃圾邮件分类问题&#xff0c;并使用混淆矩阵进行了验证&#xff0c;得到了非常好的准确率和召回率&#xff08;96%和97%&#xff09;。此外还开发了一个可视化的垃圾邮件分类系统…

前端通过ajax上传文件到七牛云

1. 从服务端获取七牛云上传的token,生成token参考官方文档https://developer.qiniu.com/kodo/1208/upload-token 2. 在七牛云文档查找上传的存储区域 https://developer.qiniu.com/kodo/1671/region-endpoint-fq 在七牛云控制台找到空间管理的cdn加速域名https://portal.qiniu…

【Thinkphp 6】框架基础知识

文章目录 环境搭建框架基础规则继承引入单应用模式多应用模式自定义路由调试器空控制器 视图模板引擎安装渲染模板facade代理变量传递view.php语法查看编译后的文件默认值数组按键取值md5加密 请求request信息参数接收生成URL 文件上传上传及验证 验证功能验证器表单令牌 中间件…

android不可不知调试技巧

目录 1、条件断点 2、评估表达式&#xff08;Evaluate Expression&#xff09; 3、日志断点 4、方法断点 5、异常断点 6、Field WatchPoint 1、条件断点 假设我们列表循环的某个元素时候才暂停&#xff0c;就用这种方式。具体方式在循环列表打断点&#xff0c;对着断点右…