题解 | #每日温度#

每日温度

http://www.nowcoder.com/practice/1f54e163e6944cc7b8759cc09e9c78d8

每日温度

739. 每日温度

问题描述

请根据每日 气温 列表 temperatures ,计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例:

输入:temperatures = [73,74,75,71,69,72,76,73]

输出:[1,1,4,2,1,1,0,0]

分析问题

既然是求每一天需要等几天才会有更高的温度,那么最直观的想法就是针对气温列表 temperatures 中的每个温度值,向后依次进行搜索,找到第一个比当前温度更高的值的位置索引,然后减去当前温度所在的位置索引,就是要求的结果。

下面我们来看一下代码的实现。

class Solution(object):
    def dailyTemperatures(self,temperatures):
        #求出温度列表的长度
        n = len(temperatures)
        result=[0]*n
        #遍历每一个温度值
        for i in range(n):
            if temperatures[i]<100:
                #想后搜索第一个大于当前温度值的元素
                for j in range(i+1,n):
                    if temperatures[j] > temperatures[i]:
                        result[i]=j-i
                        break

        return result

该算法的时间复杂度是O(n^2),空间复杂度是O(n)。

显然该算法的时间复杂度太高,那我们有什么优化的方法吗。

优化

我们这里可以使用单调栈来优化,即维护一个温度值下标的单调栈,使得从栈顶到栈底的的元素对应的温度值依次递减。具体来说,我们正向遍历温度列表 temperatures。对于温度列表中的每个元素 temperatures[i]。如果栈为空,则直接将 i 进栈;如果栈不为空,则比较栈顶元素 prev 对应的温度值 temperatures[prev] 和 当前温度 temperatures[i]。

  • 如果 temperatures[prev] < temperatures[i],则将栈顶元素 prev 移除,此时 prev 对应的等待天数为 i - prev。重复上述操作直到栈为空或者栈顶元素对应的温度大于等于当前温度,然后将 i 进栈。

  • 如果 temperatures[prev] > temperatures[i],则直接将元素 i 入栈。

下面我们来思考一个问题,为什么可以在出栈的时候更新等待天数 result[prev] 呢?因为即将进栈的元素 i 对应的温度值 temperatures[i] 一定是 temperatures[prev] 右边第一个比它大的元素。

下面我们来看一个具体的例子,假设温度列表 temperatures = [73,74,75,71,69,72,76,73] 。

初始时,单调栈 stack 为空;等待天数 result 为 [0,0,0,0,0,0,0,0]。

image-20211129124347950

image-20211129124411253

image-20211129124507019

image-20211129124531093

image-20211129124608472

image-20211129124634335

image-20211129124752957

image-20211129124817867

image-20211129124851144

下面我们来看一下代码的实现。

n = len(temperatures)
        #初始化一个空的栈
        stack = []
        result = [0] * n
        for i in range(n):
            temperature = temperatures[i]
            #如果 temperatures[i] 大于栈顶元素对应的温度值,则栈顶元素出栈。
            while stack and temperature > temperatures[stack[-1]]:
                prev = stack.pop()
                result[prev] = i - prev
            stack.append(i)
        return result

该算法的时间复杂度是O(n),空间复杂度也是O(n)。

更多题解,请关注公众号 【程序员学长】,最近把高频题都整理了一波,需要pdf版本的请私信我

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务