LeetCode 打卡 Day 51 —— 最长连续序列

1、题目

2、题解

读完题目后的第一个想法就是对数组排序,排序后对数组进行一次遍历找到其中的连续序列即可,但已知的排序算法时间复杂度都不能保证O(n)

算法最好时间复杂度最坏时间复杂度平均时间复杂度空间复杂度
快速排序O(nlog2​(n))O(n2)O(nlog2​(n))O(log2​n)
归并排序O(nlog2​(n))O(nlog2​(n))O(nlog2​(n)O(n)
堆排序O(nlog2​(n))O(nlog2​(n))O(nlog2​(n))O(1)
冒泡排序O(n)O(n2)O(n2)O(1)
选择排序O(n2)O(n2)O(n2)O(1)
插入排序O(n)O(n2)O(n2)O(1)

思考新的思路,纠结于O(n)的时间复杂度,忽略了O(n)的复杂度不是只能遍历一遍数组,而是不能嵌套地遍历数组。由于go不像其它语言可以直接判断元素是否在数组内,所以构造了一个哈希表map,用来标识数组是否包含某一数字,实现代码如下

func longestConsecutive(nums []int) int {
    ans:=0
    isAt:=map[int]bool{}
    for _, v := range nums { isAt[v]=true }
    
    for _, v := range nums {
        if isAt[v-1] { 
            continue 
        } else {
            t:=v+1
            for isAt[t] { t++ }
            if ans<(t-v) { ans=t-v }
        } 
    }
    return ans
}

 提交结果如下,运行时间依旧不太行

 

 考虑提高时间效率的方法,结合题解,发现nums数组中很有可能存在重复的数字,所以第二轮遍历针对的对象不再是nums数组,而是存放数字存在与否信息的哈希表,最后提交结果如下,时间显著提升。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值