0
点赞
收藏
分享

微信扫一扫

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

芷兮离离 2022-04-25 阅读 57
leetcode

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 条评论