【刷题日记】128. 最长连续序列

1,448 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

本次刷题日记的第 56 篇,力扣题为:128. 最长连续序列中等

一、题目描述:

最长连续序列,有点意思,看看如何才算连续,如何才算最长

二、这道题考察了什么思想?你的思路是什么?

仔细看看题目给出的要求:

  • 题中给出一个乱序的数组,我们需要找到数组中,连续的元素的个数,此处的连续 的是一个数字相互相差 1 的有序序列
  • 此处的最长指的是,连续序列元素个数最多的一组数据
  • 题目还要求我们保证时间复杂都市 O(n),我们可以看到题目不要求我们在元素组中使结果数据连续,只需要我们能够找出符合条件的序列长度即可

分析

这里我们可以看到,咱们一定要往时间复杂度为 O(n) 的要求去靠

咱们先来看一下常规我们会咋去思考,要找这个数组中的有序序列,我们可能会先找到一个数字 a,然后再遍历一次数组,找到是否有 a+1,如果有则继续找 a+2 直到 a+n ,记录一下以 a 为开头的数字有序序列长度为 n+1

再找到另外一个数字 b,继续遍历数组是否有 b+1,b+2 ... 最终也计算一个长度,和之前的 n+1 做比较,取长的一个

那这种找得话,可能咱们的 O(n^2) 的时间复杂度都扛不住

那么,怎么办,我们还是得找得去比对,是不是

那么我们就可以使用聪明一点的方式

例如上图,我们直接先看结果,如果以 100 为序列头,那么整个有序序列中就只有 100 ,那么长度为 1 ,如果以 1 为序列的头,那么可以知道整个序列有[1,2,3,4] ,总共长度为 4

既然要有序,那么一个数字,我们肯定是要判断他减去 1 和增加 1 是否存在与数组中,

如果减去 1 存在于数组中的话,那么,我们就没有必要找了,因为结果肯定不是以 当前这个数组为序列头,例如 [3,2,4,1] , 如果我们现在是以 3 为序列头来找的话,发现 2 已经是存在与数组里面了,那么结果的序列肯定不是 以 3 开头的序列,因此需要跳过当前数字,去 校验数组的下一位

那么如果加上 1 存在的话,我们就可以将当前的序列长度加 1,一次类推,最终就可以找到最长的序列长队了

另外我们可以再思考一下

如果给出的数组中有很多重复的数字,那么我们是不是需要做很多无用功,为了减少这种无用功,我们可以很轻易的想到使用 哈希表来存储题目中给出的数字,也就是去重,然后再进行查找

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,需要注意两点

  • 若原数组中有很多重复的数字,我们需要第一时间去重
  • 咱们找数据的时候,如果当前数字 -1 是存在与数组中的话,我们就不需要以这个数组为序列开头去继续查找了,我们就要跳过,然后以数组的下一个数字为序列开头按照逻辑继续找

编码如下:

func longestConsecutive(nums []int) int {
    help := map[int]bool{}
    // 先去重
    for _, num := range nums {
        help[num] = true
    }
    res := 0
    for num := range help {
    // 如果当前的数字-1 已经存在与数组中了,那么我们就没有必要找了
        if !help[num-1] {
            tmp := num
            tmpLen := 1
            for help[tmp+1] {
                tmp++
                tmpLen++
            }
            if res < tmpLen {
                res = tmpLen
            }
        }
    }
    return res
}

四、总结:

此题的实现方式我们可以很轻易的看出来,空间复杂度是 O(n) ,因为我们额外开辟了一个哈希表来存储题目给出的数组中的元素,来校验某个数字是否存在

那么时间复杂度会是 O(n^2) 吗,实际并不是的虽然我们可以看到有两个 for 循环,实际上在计算过程中,每一个数字只会进入一次 for 循环,因为,我们的做法是,遍历过的数字,符合条件的数字,咱们都是会跳过的因此,时间复杂度是 O(n)

原题地址:128. 最长连续序列

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

暂时无法在飞书文档外展示此内容