#最长连续序列*

🔗 LeetCode

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

提示

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

#解题思路

题目信息:复杂度 O(n)

#思路一

暴力遍历,每个数 n 去匹配 n+1 直到匹配不到,复杂度 O(n2k)

#思路二

通过哈希缓存数组,匹配 n+1 时复杂度降低为 1,复杂度为 O(nk)

#思路三

使用哈希匹配时,当已经有长度时,仅需要匹配比它长的,复杂度为 O(n)

#思路四

思路三的问题是仅跳过会匹配中断的,而不跳过就会复杂度超出,所以需要跳转 保证每个数是起点就好了,因为 x-x+n 肯定大于 x+1-x+n

#首次代码

function longestConsecutive(nums: number[]): number {
  const map: Record<string, boolean> = {}
  let res = 0

  // 录入哈希
  for (let i = 0; i < nums.length; i++) {
    map[nums[i]] = true
  }

  // 遍历nums,对每个num找num+1,num+2直到找不到,并且保证每个数是起点,因为x-x+n肯定大于x+1-x+n
  for (let i = 0; i < nums.length; i++) {
    let count = 100000
    let nextNum = nums[i] + 1
    let preNum = nums[i] - 1
    let length = 1

    while (!map[preNum] && map[nextNum] && count) {
      length++
      count--
      nextNum++
    }

    res = res > length ? res : length
  }

  return res
}