每日温度(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),给定一个只包含字符'(',')','{','}','['和'] ...
随机推荐
- 提交任务到spark(以wordcount为例)
1.首先需要搭建好hadoop+spark环境,并保证服务正常.本文以wordcount为例. 2.创建源文件,即输入源.hello.txt文件,内容如下: tom jerry henry jim s ...
- python正则表达式字符记录
代码 功能 . 匹配任意1个字符(除了\n) [] 匹配[]中列举的字符 \d 匹配数字,即0-9 \D 匹配非数字, 即不是数字 \s 匹配空白,即空格,tab键 \S 匹配非空白 \w ...
- 浅谈Linux进程管理
一 查看系统进程 在linux中,查看系统进程的命令为ps,常用格式为如下两个: (1)ps aux:unix格式查看系统进程 (2)ps -le:linux格式查看系统进程 一般地,ps aux更 ...
- supervisor 启动ElasticSearch报错问题
在/etc/elasticsearch/conf.d/新建一个es的配置文件,elasticsearch.conf,这里碰到一个小坑,网上很多文章介绍的是elasticsearch.ini,启动发现找 ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- [python]python的异常处理
异常处理:首先了解异常,程序出现逻辑错误或者用户输入不合法都会引发异常,而这些异常并不是致命的所以不会导致程序崩溃死掉.可以利用Python提供的异常处理机制在异常出现时及时捕获,并从内部自我消化. ...
- RDD转换为DataFrame【反射/编程】
写在前面 主要是加载文件为RDD,再把RDD转换为DataFrame,进而使用DataFrame的API或Sql进行数据的方便操作 简单理解:DataFrame=RDD+Schema 贴代码 pack ...
- sql server编写archive通用模板脚本实现自动分批删除数据
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常 ...
- CSS3 box-shadow阴影
box-shadow: color x-offset v-offset blur spred color: 阴影的颜色 x-offset: 阴影水平距离; 0: 左右阴影平分:正值:阴影在对象的右侧: ...
- 【原创】(六)Linux内存管理 - zoned page frame allocator - 1
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...