128. 最长连续序列

思路

  这题代码的要求为o(n)复杂度,那就只能空间来换时间了,O(n)常常与哈希表相关。本题的思路也在于哈希表的解法。
  遍历每个元素,如果元素不存在于哈希表的话,也就是新数加入就为其创建一个键值对。这个键值对的val代表的意思为加入了这个字符之后,这个字符所在的(组成)序列长度为多少。如果是旧数加入的话,因为最长的肯定用过它,如果没用过它,它也撼动不了最长的地位,这个序列的某个位置加入才会使它变长,也就是说这旧数的加入没有意义,就没有必要加进来。
  那么这个新加入的数字怎么样知道自己的出现会不会导致所在的序列变为最长呢?那就左边一个数字的长度+右边一个数组的长度+1,最后判断一下是否超越最长。
  注意:本题最需要注意的一个点就是比如23456这个序列新加入了这个4的话导致这个字符串变为最长之后,如果再来个1或者7,如果没有改变1右边或者7左边的数字所在的长度就不会有最新的长度,这时就是错误的,所以需要更新这个序列的两个端点。(为什么不更新中间的端点?因为相同的端点不会再进行加入,因为撼动不了最长的长度,所以此时只需要更新两个端点值即可)

代码示例

func longestConsecutive(nums []int) int {
    result:=0
    m:=make(map[int]int)
    for i:=0;i<len(nums);i++{
        if _,ok:=m[nums[i]];!ok{
            leftL,_:=m[nums[i]-1]
            rightL,_:=m[nums[i]+1]
            m[nums[i]]=leftL+rightL+1
            m[nums[i]-leftL]=m[nums[i]]
            m[nums[i]+rightL]=m[nums[i]]

            if m[nums[i]]>result{
                result=m[nums[i]]
            }
        }

    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值