问题描述
给定一个未排序的整数数组 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
解题思路:
- 先给数组排序
- 再给数组去重
- 遍历排序去重后的数组,判断当前遍历的后一位和当前位的差值是否是 1,是则当前连续序列值(nowLen)+1;否则用当前序列值(nowLen)和最长序列值(maxLen)比较,获取最长序列,并初始化当前序列值(nowLen)为 1。
代码如下:
/** * @param {number[]} nums * @return {number} */ var longestConsecutive = function(nums) { if (nums.length === 0) { return 0 } // 先排序 nums.sort((a,b) => { return a - b }) // 再去重 nums = Array.from(new Set(nums)) // 最后判断统计 let maxLen = 1 // 记录连续最长序列 let nowLen = 1 // 记录当前连续序列 for (let i = 0; i < nums.length - 1; i++) { if (nums[i + 1] - nums[i] === 1) { nowLen++ if (i === nums.length - 2) { // 处理遍历到最后一位的情况(有可能最后一次是最长的序列) maxLen = nowLen > maxLen ? nowLen : maxLen } } else { // 每次不连续的时候判断是否是最长,并初始化 nowLen maxLen = nowLen > maxLen ? nowLen : maxLen nowLen = 1 } } return maxLen };