LeetCode0739.每日温度 Go语言AC笔记

时间复杂度:O(n)

解题思路

本题可用单调栈解决。

用单调栈存放下标,栈内按照从栈底到栈顶按照下标对应元素从大到小的顺序。当从左向右遍历数组时,比较该元素与栈顶下标对应温度,如果比栈顶大说明遇到了第一个比那天高的温度,所以就弹出栈顶,元素下标与栈顶下标的差就是天数,重复此过程直至栈为空,然后遍历的下标入栈。如果遇到空的栈也是让遍历的下标直接入栈。

具体实现时注意初始化结果res数组全为0,这样遍历完全部元素后,如果还有元素在栈中那它们的对应天数都是0,因为后面没有比它们高的温度了。

AC代码

func dailyTemperatures(temperatures []int) []int {
    res:=make([]int,len(temperatures))
    s:=[]int{}//单调栈
    for i,t:=range temperatures{
        res[i]=0//初始化
        //只要栈内有元素就和栈顶比较
        for len(s)>0&&t>temperatures[s[len(s)-1]]{
            res[s[len(s)-1]]=i-s[len(s)-1]
            s=s[:len(s)-1]//出栈
        }
        s=append(s,i)//入栈
    }
    return res
}

感悟

几天不做单调栈的题就忘了单调栈思路了,貌似所有像这种要比较谁大谁小的题都可以考虑单调栈,时间复杂度为O(n)效率很高!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值