[路飞]_leetcode-128-最长连续序列

437 阅读2分钟

题目描述

[题目地址]

给定一个未排序的整数数组 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

使用-Set

解题思路

思路:数字必须是连起来的,间隔必须是1,最长的连起来的数字有多长,把这个长度返回 \

1.先从数组里面取出一个数,n判断n-1是否存在,如果存在,接着判断n-2是否存在;接着判断,直到n-x不存在,就到了我们数组的最前面;那么这个时候从x到n这个区间,就是前面最长的数字长度;\

2.先从数组里面取出一个数,n判断n+1是否存在,如果存在,接着判断n+2是否存在,如果n+2存在;接着n+m是否是存在?如果不存在就证明走到了数组里面的最后一位;此时,从n到m这个区间,就是后面最长数字长度

代码实现:

var longestConsecutive = function(nums) {
    let num_set = new Set();
    // 把所有数据放到set里面
    for(num of nums){
        num_set.add(num)
    }
    // 当前找到序列长度
    let longestStreak = 0;//初始化为0,我们找的一个数字长度;
    for(num of nums){
        if(!num_set.has(num - 1)){
            let curNum = num;
            let curStreak = 1; //现有的长度
            while(num_set.has(curNum + 1)){
                curNum += 1;
                curStreak += 1;
            }// 求的当前数的序列长度
            longestStreak = Math.max(longestStreak,curStreak);//我们找到的数字长度和现有的数字长度取最大值
        }
    }
    return longestStreak;
};

至此我们就完成了 leetcode-128-最长连续序列