[路飞][LeetCode]128_最长连续序列

167 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给定一个未排序的整数数组 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)
  • 依次遍历去重后的set数组
  • 初始化每一项连续长度初始值为1(自身)
  • 拿到遍历到的元素的左边元素以及右边元素的值
  • 查看set数组中是否存在左边/右边的数值
  • 如果存在那么len++,左侧元素数值--,右侧的++
  • 重复上面的操作直到找不到为止
  • 更新最大值(毕竟最大值与当前连接的长度,取其中较大的)
  • 返回最大值,完成题解

解题代码

var longestConsecutive = function(nums) {
    let set =  new Set(nums) // 数组去重
    let max_len = 0   // 初始化最大长度
    for(let num of set){
        let len = 1
        let left = num - 1   // 初始化连续后在当前元素左侧的数
        let right = num + 1  // 初始化连续后在当前元素右侧的数
        while (set.has(left)){
            set.delete(left) // 去除已经连续过的元素,减少循环次数
            left--  // 继续寻找比当前元素小`1`的数
            len++
        }

        while (set.has(right)){
            set.delete(right) // 去除已经连续过的元素,减少循环次数
            right++ // 继续寻找比当前元素大`1`的数
            len++  
        }
        max_len = Math.max(max_len,len)  // 更新最大值
    }
    return max_len
};

不知道是越来越独立,还是越来越心虚,走了这么久,发现唯一靠得住的还是自己,只有你把自己变好了,你足够强大了,才不会在意他人。

如有任何问题或建议,欢迎留言讨论!