前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >刷题第2篇:每日温度

刷题第2篇:每日温度

作者头像
鹏-程-万-里
发布2020-02-14 16:49:20
4460
发布2020-02-14 16:49:20
举报

各位小伙伴,大家好啊!今天是大年初二了。给大家拜年啦,祝各位新的一年里,有鼠不尽的幸福,工作顺利,爱情美满!

此次文章开始之前,小白想先聊聊最近的疫情吧。今年过年,因为新型病毒的问题,大家都挺闹心的。小白家在湖北,处于疫情最为严重的区域,在大年三十的最后一刻,湖北全省封城。各个群里还有新闻媒体上,都充斥着各种不利的新闻,闹得人心惶惶。

不过,小白一直以来的理念就是————塞翁失马,焉知非福。将所有的危机变为转机!

一场疫情的到来,全国呼吁大家闭门不出,而时处春节时期,这种呼吁不也正好给了大家一个多和父母相处的机会么。时常会畅想未来,计算着和父母在一起的剩余时间,有时候算着算着,发现时间已经所剩不多,那么这一次又何不是一个良好的机会呢~

与此同时,抗击病毒,一直是我们自身的免疫系统作为主导。所有的治疗,也都是通过外界的方式,将病毒降低到我们自身免疫系统可以控制的地步。所以啊,我们最重要的还是要提高自己的免疫力。然而短时间的提高不太可能,但是焦虑和恐惧会降低我们的免疫力,所以还是放松心态吧!


下面进入正题吧!

题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73], 你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

第一种方案
1、解决思路

第一种也是我们最容易想到的思路,从第一个温度开始向后遍历,与后续的每一个温度进行比较,与此同时进行计数操作,如果遇到较大的温度,则停止计数,计数结果即为当前温度节点需要的值,如果遍历到最后都没有找到一个结果,那么就将其赋值为0。

2、实现代码
代码语言:javascript
复制
    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;
    }
3、执行的结果
第二种思路
1、实现思路

上面的第一种思路属于最好想到的解决方法,但是从执行结果上可以看到:运行时间较长,使用的空间也较大。主要是因为我们需要对当前节点之后的每一个节点进行遍历,太过于浪费资源。那么此时可以考虑缩小第二次的遍历长度,这样就可以在一定程度上提高效率。

下面的这种思路也是在LeetCode上看到的一种解决方案,主要的想法就是使用倒序的遍历方法,从后向前记录每一个节点的结果。当前节点i与后面一个节点j进行比较的时候,如果后面一个节点温度j小于当前节点的温度,那么下一次比较的温度节点应该是大于温度节点j的温度节点,而并非无意义的比较后面的每一个温度。这样就可以“跳过”一些较小的节点,提高效率。

2、实现代码
代码语言:javascript
复制
    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;
    }
3、执行的结果

以上就是本周的内容了,在家的这段时间,学习效率的确是大大折扣,内容也挺少的。不过还是尽量保证与各位小伙伴的每周一约吧!嘻嘻!武汉加油,湖北加油!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
    • 第一种方案
      • 第二种思路
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档