LeetCode 739 每日温度

1、解法1

        看完题目后感觉最直观的暴力解法还是比较容易想到的,就是遍历数组,对于当前温度 temperatures[i],遍历之后各天的温度,找到第一个温度高于 temperatures[i] 的 temperatures[j],将 j 存储于answer[i] 中。本来以为会超出时间限制,没想到居然通过了,实现的代码如下。

func dailyTemperatures(temperatures []int) []int {
    var length int=len(temperatures)
    var answer []int=make([]int, length)
    for k, v := range temperatures{
        for j:=1; k+j<length; j++{
            if temperatures[k+j]>v{
                answer[k]=j
                break
            }
        }
    }
    return answer
}

 2、解法2

        想一些可以优化的方法,看了答案之后发现可以使用递减栈完成,即维护一个数字大小递减的栈(注意:栈中存储的不是数字,而是对应数字在数组中的下标)。我们对数组进行遍历。

  • 当栈为空时,将当前数字入栈。
  • 当栈不为空时,与栈顶数字比较:(1)如果当前数字小于栈顶数字,那么将当前数字入栈(2)如果当前数字大于栈顶数字,弹出栈顶数字,栈顶数字对应的 answer 即为当前数字下标-栈顶数字下标。重复上述操作,直到栈为空或者栈顶数字大于当前数字,将当前数字入栈。

实现代码如下

func dailyTemperatures(temperatures []int) []int {
    var length int=len(temperatures)
    var stack []int
    var answer []int=make([]int, length)

    for k, v := range temperatures{
        for len(stack)>0 && v>temperatures[stack[len(stack)-1]]{    // 栈不为空且栈顶元素小于当前元素
            tmp:=stack[len(stack)-1]
            answer[tmp]=k-tmp
            stack=stack[:len(stack)-1]
        }
        stack = append(stack, k)
    }
    return answer
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值