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

1、题目

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
}

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

 

LeetCode 打卡 Day 51 —— 最长连续序列_第2张图片

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

LeetCode 打卡 Day 51 —— 最长连续序列_第3张图片

你可能感兴趣的:(Go,leetcode)