各位小伙伴,大家好啊!今天是大年初二了。给大家拜年啦,祝各位新的一年里,有鼠不尽的幸福,工作顺利,爱情美满!
此次文章开始之前,小白想先聊聊最近的疫情吧。今年过年,因为新型病毒的问题,大家都挺闹心的。小白家在湖北,处于疫情最为严重的区域,在大年三十的最后一刻,湖北全省封城。各个群里还有新闻媒体上,都充斥着各种不利的新闻,闹得人心惶惶。
不过,小白一直以来的理念就是————塞翁失马,焉知非福。将所有的危机变为转机!
一场疫情的到来,全国呼吁大家闭门不出,而时处春节时期,这种呼吁不也正好给了大家一个多和父母相处的机会么。时常会畅想未来,计算着和父母在一起的剩余时间,有时候算着算着,发现时间已经所剩不多,那么这一次又何不是一个良好的机会呢~
与此同时,抗击病毒,一直是我们自身的免疫系统作为主导。所有的治疗,也都是通过外界的方式,将病毒降低到我们自身免疫系统可以控制的地步。所以啊,我们最重要的还是要提高自己的免疫力。然而短时间的提高不太可能,但是焦虑和恐惧会降低我们的免疫力,所以还是放松心态吧!
下面进入正题吧!
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73], 你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
第一种也是我们最容易想到的思路,从第一个温度开始向后遍历,与后续的每一个温度进行比较,与此同时进行计数操作,如果遇到较大的温度,则停止计数,计数结果即为当前温度节点需要的值,如果遍历到最后都没有找到一个结果,那么就将其赋值为0。
public int[] dailyTemperatures(int[] T) {
int[] days = new int[T.length];
for (int i = 0; i < T.length-1; i++){
int j = i+1;
for (;j<T.length;j++){
if (T[i] >= T[j] && j == T.length-1){
days[i] = 0;
}else if (T[i] >= T[j]){
days[i]++;
}else {
days[i]++;
break;
}
}
}
return days;
}
上面的第一种思路属于最好想到的解决方法,但是从执行结果上可以看到:运行时间较长,使用的空间也较大。主要是因为我们需要对当前节点之后的每一个节点进行遍历,太过于浪费资源。那么此时可以考虑缩小第二次的遍历长度,这样就可以在一定程度上提高效率。
下面的这种思路也是在LeetCode上看到的一种解决方案,主要的想法就是使用倒序的遍历方法,从后向前记录每一个节点的结果。当前节点i与后面一个节点j进行比较的时候,如果后面一个节点温度j小于当前节点的温度,那么下一次比较的温度节点应该是大于温度节点j的温度节点,而并非无意义的比较后面的每一个温度。这样就可以“跳过”一些较小的节点,提高效率。
public int[] dailyTemperatures(int[] T) {
int len = T.length;
int[] ans = new int[len];//存放最后的结果,比当前温度更高的距离
for (int i = len-2 ; i >= 0 ; i--){
for (int j = i + 1 ; j < len ;){
if (T[i] < T[j]){ //已找到离当前温度i最近的更高温度的索引
j = j - i;//直接计算两个索引的差值,即为需要多少天才能够比当前温度高
ans[i] = j;
break;
}else if (ans[j] == 0){//如果新的温度节点j的温度并没有高于当前节点i,并且j节点的ans已经为0,则代表后面也不会有比i节点更高的温度了
ans[i] = 0;
break;
}
j += ans[j];//如果上面的两种判断都不成立,代表当前j节点的温度小于或等于i节点的温度,则继续向后寻找比j节点更高温度节点
}
}
return ans;
}
以上就是本周的内容了,在家的这段时间,学习效率的确是大大折扣,内容也挺少的。不过还是尽量保证与各位小伙伴的每周一约吧!嘻嘻!武汉加油,湖北加油!