[路飞]_128. 最长连续序列

122 阅读1分钟

题目地址

题目描述

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

解题思路

  • 根据题意可知,数字必须的连续的,间隔为1,最长的连起来的数字有多长,返回这个值
  • 设置一个set数组,存放所有nums的值,利用set的has属性去判断,当前值-1的值是否存在
  • 如果存在,就设置长度初始化为1,然后去循环当前值+1是否存在,累计这个数
  • 求出累计数中的最大值并返回

代码

var longestConsecutive = function(nums) {
    let nums_set = new Set();
    for(num of nums) {
        nums_set.add(num);
    }
    // 再次循环nums
    let ans = 0; // 结果最长数字长度,初始化为0
    for(num of nums) {
        if(!nums_set.has(num - 1)) {
            let current = num;
            let long = 1;
            // 判断当前值加1是否存在
            while(nums_set.has(current + 1)) {
                // 当前值加1
                current += 1;
                long += 1;
            }
            ans = Math.max(ans, long);
        }
    }
    return ans;
}