128. 最长连续序列
题目描述:
- 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
方法一:排序
思路如下:
- 先从小到大排序
- 遍历数组,比较相邻的两项,如果相同,则跳过,继续遍历下一项
- 如果
当前项+1等于 下一项,说明遇到连续项,count +1 - 否则,说明连续情况发生中断,将
count重置为 1
代码
js
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function (nums) {
if (nums.length === 0) return 0;
nums.sort((a, b) => a - b);
let max = 1,
count = 1;
for (let i = 0; i <= nums.length; i++) {
if (nums[i] === nums[i + 1]) continue;
if (nums[i] + 1 === nums[i + 1]) {
count++;
} else {
count = 1;
}
max = Math.max(max, count);
}
return max;
};方法二:Set
思路如下:
- 将数组元素存入
set中,遍历数组 nums - 如果
当前项 - 1存在于set,说明当前项不是连续序列的起点,跳过,继续遍历 - 当前项没有
左邻居,它就是连续序列的起点 - 不断在
set中查看cur + 1是否存在,存在,则count +1 - cur 不再有
右邻居了,就算出了以某个最左节点开始的一段连续序列的长度
作者:笨猪爆破组 链接 来源:力扣(LeetCode)
代码
js
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function (nums) {
const set = new Set(nums);
let max = 0;
for (let i = 0; i < nums.length; i++) {
if (!set.has(nums[i] - 1)) {
let count = 1,
cur = nums[i];
while (set.has(cur + 1)) {
cur++;
count++;
}
max = Math.max(max, count);
}
}
return max;
};
russ