【hot100】跟着小王一起刷leetcode -- 739. 每日温度

【hot100】跟着小王一起刷leetcode -- 739. 每日温度

  • 739. 每日温度
    • 题目解读
    • 思路
  • 代码
  • 总结

739. 每日温度

题目解读

739. 每日温度
在这里插入图片描述

老规矩,咱先看下题目。总结下来就是,你要返回一个answer数组,answer[i]中存储的应该是temperatures数组中比temperatures[i]大的第一个数的下标,如果不存在这样的数answer[i]置为0即可。

那么咱首先的思路是啥呢

第一个,必然是暴力解法,这不很简单,直接按个遍历temperatures中的数据,然后每遍历一个数的时候,就看看后面第一个比他大的数的下标是啥就行了。

这时候你兴致勃勃写完代码,然后提交上去,结果发现。。。。。。
在这里插入图片描述
在这里插入图片描述

那怎么让时间降下来呢

咱们考虑考虑,是不是做了无用功

例如哈,咱们在判断的位置为index的answer,也就是计算第一个比**temperatures[index]**的值的位置时,会和后面的值去比较。这使得我们的计算复杂度到了O(n*n),那有没有可能我在遍历到某个后续值的时候,就知道后面不会再有比他大的值了呢?这样子是不是复杂度就下来了。那该怎么弄呢。

很简单的思路,既然要知道后面的情况,肯定要从后往前遍历嘛?那该怎么做呢?

思路

咱们大概捋一下过程。最后一个下标的answer一定为0,这个没得说,因为都没有值了,肯定不如它大。

那咱们就可以直接从倒数第二个值开始处理了。当前,我们需要判断倒数第二值之后有没有更大的,如果有的话,就设置为更大值下标-当前下标,如果没有就设置为0。这个也很简单,就和倒数第一个比较下就可以了,然后设置就完事了。

到了倒数第三个的时候就不一样了,这时在处理的时候就需要多种讨论了。

接下来咱们来看看

第一种,后续值比当前值大,那没的说,直接设置answer为更大值下标-当前下标即可。
第二种,后续值等于当前值,这时候就有两种情况了。第一种,相等值下标的answer不为0,当前值answer就是相等值下标-当前下标+相等值下标的answer。第二种,相等值下标的answer为0,那当前也直接设置为0就可以了。
第三种,后续值小于当前值。这个时候不要无脑往后遍历,咱们要充分利用现有的信息。判断较小值的answer是为0,为0的话,直接设置当前answer为0即可;不为0,代表后面可能还有更大的。此时我们要一个个遍历嘛?

显然不是! 我们直接利用较小值的answer,跳转到较小值坐标+较小值的answer进行判断即可,因为中间的数据都比较小值小了,那怎么可能比当前值大呢。

就这样,循环即可,答案就出来了,并且时间省了很多。

代码

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int index = temperatures.length - 1;
        int[] answer = new int[temperatures.length];
        answer[temperatures.length - 1] = 0;
        for (int i = temperatures.length - 2; i >= 0; i--) {
            int after = i + 1;
            while (after < temperatures.length) {
                // temperatures[after ]比temperatures[i]大,这个时候直接赋值answer数组即可,并且可以停止了,因为我们已经找到了第一个大的。
                if (temperatures[after] > temperatures[i]) {
                    answer[i] = after - i;
                    break;
                }

                // temperatures[after]等于temperatures[i]
                if (temperatures[after] == temperatures[i]) {
                    // 经过我们的遍历,i到after之间不存在比temperatures[i]大的值。这是因为如果存在这样的值,我们的上一个循环就停止了。
                    // 并且after到after+answer[after]之间也不会存在比temperatures[after]大的值,因为answer[after]代表的是after之后第一个比temperatures[after]大的值。
                    // 综合上述两点,answer[i]=after - i + answer[after];
                    if (answer[after] != 0)
                        answer[i] = after - i + answer[after];
                    else
                    // 如果answer[after]=0,代表i之后没有比temperatures[i]大的值,因此直接设置answer为0.
                        answer[i] = 0;
                    break;
                }

                // temperatures[after]小于temperatures[i]
                // 如果answer[after] 为0的话,都没有比temperatures[after]小的了,那肯定没有比temperatures[i]小的值,所以直接设置answer为0.
                if (answer[after] == 0) {
                    answer[i] = 0;
                    break;
                }
                
                   // 这里大家可能看的有点迷,还能这么搞吗,我们来解释下
                   // 来到这里,说明什么?
                   // 如果temperatures[after]大于temperatures[i],第一个判断就截胡了,到不了这。同理temperatures[after]等于temperatures[i]也是如此。
                   // 同样小于并且answer为0的情况我们也判断了,所以这里只有一种可能
                   // 也就是temperatures[after]小于temperatures[i],并且answer还不为0,这个时候再结合咱们在思路的分析,直接这样跳转就可以了。
                   after=after+answer[after];

            }
        }
        return answer;
    }
}

总结

在这里插入图片描述
时间复杂度还行,就是空间,emmm。。。。。。

这道题还是挺有意思的,大家一起讨论讨论。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android跨进程通信,binder传输数据过大导致客户端APP,Crash,异常捕获,监听异常的数值临界值,提前Hook拦截。

文章目录 Android跨进程通信&#xff0c;binder传输数据过大导致Crash&#xff0c;异常捕获&#xff0c;监听异常的数值临界值&#xff0c;提前Hook拦截。1.binder在做跨进程传输时&#xff0c;最大可以携带多少数据1.1有时候这个1m的崩溃系统捕获不到异常&#xff0c; 2.监测异…

深度学习与飞桨 PaddlePaddle Fluid

编辑推荐 飞桨PaddlePaddle是百度推出的深度学习框架&#xff0c;不仅支撑了百度公司的很多业务和应用&#xff0c;而且随着其开源过程的推进&#xff0c;在其他行业得到普及和应用。 本书基于2019年7月4日发布的飞桨PaddlePaddle Fluid 1.5版本&#xff08;后续版本会兼容旧版…

[工业网络] 模型建立

普渡大学ICS参考模型 普渡企业参考架构&#xff08;PERA&#xff09;是由西奥多J威廉姆斯&#xff08;Theodore J. Williams&#xff09;和普渡大学计算机集成制造工业大学联盟的成员在1990年代开发的企业架构参考模型。该模型被ISA-99&#xff08;现为ISA/IEC 62443&#xff…

warning: LF will be replaced by CRLF the next time Git touches it warning

问题&#xff1a; warning: in the working copy of , LF will be replaced by CRLF the next time Git touches it warning: 今天上传git时报错&#xff0c;使用Ai&#xff1b;得知&#xff1b; 解决&#xff1a; 将 Git 配置为不自动转换换行符&#xff0c;使用以下命令…

snap和apt的区别简单了解

Linux中没有tree命令的时候提示安装的时候出现了两个命令&#xff0c;简单看了看两者有何区别&#xff08;一般用apt就可以了&#xff09;&#xff1a; sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的&#xff0c;但它们使用的是不…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的&#xff0c;即客户端发起请求&#xff0c;服务器响应请求&#xff0c;然后连接关闭。但是&#xff0c;WebSocket允许服务器和客户端…

Spring Boot2.x教程:(四)Spring Boot2.6及之后版本整合Knife4j的问题

Spring Boot2.6及之后版本整合Knife4j的问题 1、概述2、问题出现原因及解决办法3、拓展3.1、为什么发生这种变化 4、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、概述 今天在2.7…

Raylib 坐标系适应与GPU绘制参数

通过750 - 鼠标坐标&#xff0c;把原点在左上角的鼠标坐标变成左下角 实现输入数据后的坐标系同GPU原点在左下角坐标相同&#xff0c; 比数组0&#xff0c;0对应左上角好&#xff0c; 此时实际上数组0&#xff0c;0对应左下角 #include <raylib.h> // 感受&#xff1a…

如何用Python实现三维可视化?

Python拥有很多优秀的三维图像可视化工具&#xff0c;主要基于图形处理库WebGL、OpenGL或者VTK。 这些工具主要用于大规模空间标量数据、向量场数据、张量场数据等等的可视化&#xff0c;实际运用场景主要在海洋大气建模、飞机模型设计、桥梁设计、电磁场分析等等。 本文简单…

OpenELM:开启开放训练和推理框架的高效语言模型家族

随着大模型模型规模的增长&#xff0c;这些强大工具的透明度、可复现性和对数据偏见的敏感性也引起了人们的关注。这些问题不仅关系到研究的开放性和公平性&#xff0c;也关系到模型输出的可信度和安全性。为了应对这些挑战&#xff0c;Apple的研究团队发布了名为OpenELM的新一…

守护进程到底是什么?如何创建?(图文并茂,你不得不看的一篇文章)

目录 守护进程&#xff08;Daemon Process&#xff09;详解 守护进程的特点 创建守护进程的步骤 用守护进程实现输入Hello功能 守护进程的用途 如何查看我们的守护进程&#xff1f; 1. ps 命令 2. top 命令 总结 守护进程&#xff08;Daemon Process&#xff09;详解 …

如何在主动动态安全中使用人工智能驱动的威胁分类提高防御精准度

面对当今世界不断演变的网络威胁&#xff0c;人工智能和网络安全将会发挥重要的防护作用。在数据泄露和网络攻击日益突出的时代&#xff0c;人工智能和网络安全之间的合作成为数字安全战场上的强大盟友。 本文将深入研究这两个领域的融合&#xff0c;揭示它们在彻底改变威胁检测…

Java---Mybatis详解二

雄鹰展翅凌空飞&#xff0c; 大江奔流不回头。 壮志未酬心未老&#xff0c; 豪情万丈任遨游。 巍巍高山攀顶峰&#xff0c; 滔滔黄河入海流。 风云变幻凭君舞&#xff0c; 踏遍天涯尽逍遥。 目录 一&#xff0c;环境准备 二&#xff0c;删除 三&#xff0c;删除(预编译SQL) 为什…

奇瑞被曝强制加班,“896”成常态且没有加班费

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7 月 2 日消息&#xff0c;一位认证为“奇瑞员工”的网友近期发帖引发热议&#xff0c;奇瑞汽车内部存在强制加班行为&#xff0c;每周加班时长需大于 20 小时并且没有加班费&#xff0c;仅补贴 10 元…

CJSON库

目录 一、介绍 1、JSON是什么 2、为什么使用CJSON 3、JSON格式 二、使用CJSON构造JSON 1、创建对象 2、添加字段 3、转换格式 4、释放对象 三、使用CJSON解析JSON 1、解析数据 2、 获取字段 3、释放对象 一、介绍 1、JSON是什么 JSON是什么呢&#xff1f;JSON全称…

Android studio 打包低版本的Android项目报错

一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…

如何创建移动类型

第一步打开事务代码&#xff1a; OMJJ 下面这个工作区可以不填&#xff0c;或者填入你的范围&#xff08;例如我准备copy Z52成为Z54 那么就可以输入从Z52到Z54&#xff0c;SAP的这个操作就是这么怪&#xff0c;哈哈&#xff09;不然就会出现一个这样的报错“在工作区中指定关…

聚焦西安应博会|2024西安城市安全应急产业展9月精彩呈现

2024西安城市安全应急产业博览会 时间&#xff1a;2024年9月12日-14日 地点&#xff1a;西安国际会展中心 运营&#xff1a;西安西部文化产业博览会有限公司 【展会简介】 为推动安全应急装备向智能化、成套化、专业化方向发展&#xff0c;迎接新质生产力在应急产业新技术…

在C++中,工厂模式的思考(《C++20设计模式》及常规设计模式对比)

文章目录 一、前言二、讲解1、构造函数的弊端2、工厂方法&#xff08;解决上述弊端&#xff09;3、简单工厂3.1 **UML类图**3.2 **实现** 4、工厂模式4.1 **UML类图**4.2 **实现** 5、抽象工厂5.1 **UML类图**5.2 **实现** 三、总结 一、前言 在看《C20设计模式》一书中产生了…

【软件测试】快速定位bug,编写测试用例

作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在团队里你在开发中的地位显而易见 &#xff0c;口碑、升值、加薪那应该是你遥不可及的梦 但是作为测试人员来说&…