Shu-How Zの小窝

Loading...

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;
}
posted @ 2025-04-27 18:26  KooTeam  阅读(8)  评论(0)    收藏  举报