Skip to content
本页目录

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;
};

MIT Licensed