128. 最长连续序列
思路:数字必须是连起来的,间隔必须是1,最长的连起来的数字有多长,把这个长度返回
1.先从数组里面取出一个数,n判断n-1是否存在:如果存在,接着判断n-2是否存在:接着判断,直到n-x不存在,就到了我们数组的最前面:那么这个时候
从x 到n这个区间,就是前面最长的数字长度;接着判断 n+1是存在的吗?如果存在,接着判断 n+2存在的吗?如果n+2存在:接着判断n+m是否存在?如果不存在l
证明走到了数组的最后一位;此时,从n 到 m这个区间就是后面部分的最长数字长度;
Set o(n)
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
let set = new Set()
for(num of nums){
set.add(num)
}
let longestStreak = 0 // 初始化为0,我们找的一个数字长度;我们找到的长度
for (num of nums) {
if(!set.has(num-1)){
let currentNum = num
let currentStreak = 1 // 当前数字的长度,初始化为1
while(set.has(currentNum+1)){
currentNum += 1
currentStreak += 1
} // 求的当前数的序列长度
// 找到的数字长度和现有的数字长度,找到一个最大值
longestStreak = Math.max(longestStreak, currentStreak)
}
}
return longestStreak
};
//多数据 上面的版本 不通过
// 修改后 通过版本 将第二次 for..of 对象 改为set数据 去重后的数据
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
let set = new Set()
for(num of nums){
set.add(num)
}
let longestStreak = 0 // 初始化为0,我们找的一个数字长度;我们找到的长度
for (num of set) {
if(!set.has(num-1)){
let currentNum = num
let currentStreak = 1 // 当前数字的长度,初始化为1
while(set.has(currentNum+1)){
currentNum++
currentStreak++
} // 求的当前数的序列长度
// 找到的数字长度和现有的数字长度,找到一个最大值
longestStreak = Math.max(longestStreak, currentStreak)
}
}
return longestStreak
};
// 简单版本
var longestConsecutive = function(nums) {
let result = 0;
let set = new Set(nums);
for (let num of set) {
if (!set.has(num + 1)) {
let max = 0;
while (set.has(num--)) max++;
result = Math.max(result, max);
}
}
return result;
}

浙公网安备 33010602011771号