每日温度(LeetCode Medium难度算法题)题解
LeetCode 题号739中等难度 每日温度
题目描述:
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
虽说这是一个中等难度的题目,但看完题目后会发现其实要做出来其实不困难,甚至可以说有点简单(单纯的为了AC)
很简单,题目要求就是给一个数组,让你返回一个数组,新数组对应位置表示的是题目给的数组对应位置往后找第一个值比其大的位置距离,如果没有则为0;
直接简单循环遍历就可以通过了。
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] ans = new int[T.length];
for(int i = 0 ; i < T.length-1;i++){
ans[i] = 0 ;
for(int j = i+1;j<T.length;j++){
if(T[j]>T[i]){
ans[i] = j-i;
break;
}
}
}
return ans;
}
}
这样子就可以ac了,但是效率呢?
先上ac后截图:
223ms- -,吓死个人了。仅仅30%多而已。
在我看来,刷题第一个目标是为了ac,第二个目标是优化。
本人也是个渣渣,也不会优化- -。但是leetcode上有大牛- -。
多说无益直接上大牛代码:
class Solution {
public int[] dailyTemperatures(int[] T) {
int length = T.length;
int[] result = new int[length]; //从右向左遍历
for (int i = length - 2; i >= 0; i--) {
// j+= result[j]是利用已经有的结果进行跳跃
for (int j = i + 1; j < length; j+= result[j]) {
if (T[j] > T[i]) {
result[i] = j - i;
break;
} else if (result[j] == 0) { //遇到0表示后面不会有更大的值,那当然当前值就应该也为0
result[i] = 0;
break;
}
}
} return result;
}
}
看起来好像没有什么变化好像只是菜鸡小老弟我多了个几行- -。
但是我们看看大佬代码ac后的截图
4ms,和菜鸡我的200多ms 比起来我只是个弟中弟。
话不多说来分析一下大佬的精辟思想。
直接看核心代码:
//从右向左遍历
for (int i = length - 2; i >= 0; i--) {
// j+= result[j]是利用已经有的结果进行跳跃
for (int j = i + 1; j < length; j+= result[j]) {
if (T[j] > T[i]) {
result[i] = j - i;
break;
} else if (result[j] == 0) { //遇到0表示后面不会有更大的值,那当然当前值就应该也为0
result[i] = 0;
break;
}
}
} 作者:pulsaryu
链接:https://leetcode-cn.com/problems/daily-temperatures/solution/jie-ti-si-lu-by-pulsaryu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
大佬习惯——代码写注释。
可能有的人看完还不是很懂我们具体再分析一下。
首先,我们肯定要遍历每一个数组元素的值的。那我们优化的点只能是在比较的过程。
回想题目要求,我们是要从当前位置往后面找第一个比该位置值大的位置与他的距离(其实就是下标的差);
然后把这个距离存进返回的数组对应的位置下标。
我们正常想都是从前往后遍历。但是这题我们每次遍历都得往后找。那我们可以尝试着从后往前即从右往左啦。
再这个基础上,再往后找。
这样子的好处是我们往后找的时候,后方的位置都是已经计算好的。
如果我们的是从前往后遍历,那我们比较永远只能一个位置一个位置都比较找到第一个值大的位置则为止继续找下一个位置。
如果我们已经算好后方的位置呢?
看下大佬的图文:
71的位置对应值2,表明71的后面的的第二个元素就是第一个比71大的位置。
这样子我们就可以跳跃。我们求75位置。往后找的时候,如果后方的比当前位置小,那们我们没有必要j++这样子一个一个看,我们可以直接
根据后方元素的值即result[j]跳跃,我们不用j++;我们可以直接j = j+ result[j];再与75比较如果比75大则返回索引差。
如果后方位置的值 比当前位置小并且result[j]==0代表什么呢?就是代表 j 位置 后方的都没有j 位置的大。而当前位置又比J位置的大。那当前位置
往后找也找不出一个比其大的位置 所以 直接result[i] = 0;
每一次计算出当前位置的值后我们就直接break 掉内层循环 然后接着遍历前一个元素即可.
其实这种跳跃思想有点像 字符串模式匹配用到的KMP算法next数组的思想。
如果不知道KMP是什么的可以点下方连接学习
https://blog.csdn.net/sinat_37537673/article/details/73331135
本人只是个普通二本在读大二的菜鸡,只是个搬运工,不喜勿喷- -。
每日温度(LeetCode Medium难度算法题)题解的更多相关文章
- 黄金矿工(LeetCode Medium难度)1129题 题解(DFS)
题目描述: 给定一个二维网络,给定任意起点与终点.每一步可以往4个方向走.要找出黄金最多的一条线路. 很明显的是要“一条路走到黑,一直下去直到某个条件停止”. 运用dfs(深度优先搜索)求解. 因为起 ...
- python(leetcode)-重复元素算法题
leetcode初级算法 问题描述 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 该问题表述非常简单 ...
- 【leetcode】经典算法题-Counting Bits
题目描述: 给定一个数字n,统计0-n之间的数字二进制的1的个数,并用数组输出 例子: For num = 5 you should return [0,1,1,2,1,2]. 要求: 算法复杂复o( ...
- LeetCoded第739题题解--每日温度
每日温度 请根据每日 气温 列表,重新生成一个列表.对应位置的输出为:要想观测到更高的气温,至少需要等待的天数.如果气温在这之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temper ...
- LeetCode:每日温度【739】
LeetCode:每日温度[739] 题目描述 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替. 例如,给定一个列 ...
- 解决一道leetcode算法题的曲折过程及引发的思考
写在前面 本题实际解题过程是 从 40秒 --> 24秒 -->1.5秒 --> 715ms --> 320ms --> 48ms --> 36ms --> ...
- LeetCode算法题-Valid Palindrome(Java实现)
这是悦乐书的第174次更新,第176篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125).给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略 ...
- 【算法】LeetCode算法题-Merge Two Sorted List
这是悦乐书的第148次更新,第150篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第7题(顺位题号是21).合并两个已排序的链表并将其作为新链表返回. 新链表应该通过拼接 ...
- 【算法】LeetCode算法题-Valid Parentheses
这是悦乐书的第147次更新,第149篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第6题(顺位题号是20),给定一个只包含字符'(',')','{','}','['和'] ...
随机推荐
- 配置hibernate访问mysql
在之前搭建spring mvc项目这篇的基础上继续集成,引入hibernate支持 一.添加jar包引用 修改pom.xml文件,加入: <dependency> <groupId& ...
- android studio连接雷电模拟器 【AS 模拟器】
⭐ 我的网站: www.mengyingjie.com ⭐ Android studio 怎么连接安卓模拟器呢,跟着下面的步骤即可 (以雷电模拟器为例,其他模拟器类似) 一.下载模拟器 下载安装完雷电 ...
- Hadoop入门 之 Hadoop的安装
1.安装Hadoop的三大步骤 答:1.Linux环境,2.JDK环境,3.配置Hadoop. 2.安装Linux 答:利用阿里云,腾讯云等公有云.选择Ubuntu进行安装,然后利用小putty进行操 ...
- 让tomcat使用指定JDK
一,前言 我们都知道,tomcat启动前需要配置JDK环境变量,如果没有配置JDK的环境变量,那么tomcat启动的时候就会报错,也就是无法启动. 但是在我们的工作或者学习过程中,有的时候会出现tom ...
- selenium-04-验证码问题
对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的,对于系统来说使用验证码可以有效果的防止采用机器猜测方法 ...
- Scrapy项目 - 数据简析 - 实现斗鱼直播网站信息爬取的爬虫设计
一.数据分析截图(weka数据分析截图 2-3个图,作业文字描述) 本次将所爬取的数据信息,如:房间数,直播类别和人气,导入Weka 3.7工具进行数据分析.有关本次的数据分析详情详见下图所示: ...
- 【SQL server基础】获取当前时间并固定格式
Select CONVERT(varchar(), GETDATE(), ): // Select CONVERT(varchar(), GETDATE(), ): Select CONVERT(va ...
- 在ZYBO板卡上实现PL-PS交互(通过AXI的方式)
前情提要:参考的是下面所说的原网页,只是原作者用的是vivado 2014.4,我用vivado 2018.2跑的,图是新的,内容大多“换汤不换药”,但是我在做的时候存在一些问题,我记录了下来并将解决 ...
- 2.css3表示颜色的几种方式
1.css3中表示颜色的几种方式: ⑴颜色名称.十六进制.RGB方式: ⑵RGBA方式:新增了alpha参数,介于0.0(完全透明)到1.0(完全不透明)之间: ⑶HSL方式:分别表示色调.饱和度.亮 ...
- Nebula 架构剖析系列(一)图数据库的存储设计
摘要 在讨论某个数据库时,存储 ( Storage ) 和计算 ( Query Engine ) 通常是讨论的热点,也是爱好者们了解某个数据库不可或缺的部分.每个数据库都有其独有的存储.计算方式,今天 ...