每日温度(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),给定一个只包含字符'(',')','{','}','['和'] ...
随机推荐
- 过渡 - transition
过渡 - transition 是变形transfrom其中一种效果,定义为一种状态过渡到另一种状态的过程,今天学习到css3动画,特此记录下过渡的使用和一些效果. 实例1: <div clas ...
- [LeetCode]sum合集
LeetCode很喜欢sum,里面sum题一堆. 1.Two Sum Given an array of integers, return indices of the two numbers suc ...
- 编程必备基础知识|计算机组成原理篇(09):CPU的控制器和运算器
计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识.关于计算机基础的课程很多,内容繁 ...
- 08.Django基础六之ORM中的锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- Promise核心原理解析
作者: HerryLo 本文永久有效链接: https://github.com/AttemptWeb...... Promises对象被用于表示一个异步操作的最终完成 (或失败), 及其结果值.主要 ...
- 关于大脑与CPU的简单思考
今天午休突发奇想的思考了大脑与cpu的差异,发现出了大脑是生物信号驱动的单核cpu而已(并行任务是时间片的调度,要额外的堆栈记忆或者物理如纸张的存储). 大脑永远是线性的逐行执行指令,执行期间无法判断 ...
- Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
Spring AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
- 3D漫游的分类 3D Navigation Taxonomy
在2001年CHI发表的论文中1,Tan等人提出了一种对3D漫游的分类方法. 当时关于3D漫游(3D Navigation)的研究主要分为两种:一种是发掘有关漫游的认知原则,一种是开发一些具体的漫游技 ...
- Centos6 日常使用小结
网络配置目录 1./etc/sysconfig/network-script/ifcfg-eth0 2.netstat -rn Kernel IP routing table Destination ...
- tiki-graph_formula.php代码执行漏洞复现(或许??)
1.不知道从哪里翻出来的虚拟机镜像(不知道甚么时候出现在磁盘里面的) 打开配置一下是tikiwiki这个东西 2.遇到陌生的玩意总是忍不住好奇心的,打开nikto扫描一下,发现有些奇怪的东西 本来没抱 ...