JS算法-最长连续序列

223 阅读2分钟

题目

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

输入: nums = [100,4,200,1,3,2]
输出: 4
解释: 最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4

题解

第一种

首先判断给定的数组是否为空,如果是则直接返回 0,使用数组的 sort 方法将数组从小到大进行排序,声明三个变量,分别为 countNum、maxItem 和 maxNum。countNum 表示当前连续序列的长度,初始值为 1,maxItem 表示当前位置的元素值,初始值为排序后的数组第一个元素,maxNum 表示最长的连续序列的长度,初始值为 1,使用 for 循环遍历数组,从第二个元素开始遍历,在遍历过程中,如果当前元素值等于 maxItem 加 1,则表示当前元素在连续序列中,countNum 加 1,并将 countNum 与 maxNum 进行比较,更新 maxNum 的值;否则,如果当前元素值不等于 maxItem,则表示当前位置不在连续序列中,将 countNum 的值重置为 1,最后,在遍历完成后,返回 maxNum 的值即可。

    var longestConsecutive = function (nums) {
      if (!nums || !nums.length) return 0;
      nums.sort((a, b) => { return a - b });
      let countNum = 1, maxItem = nums[0], maxNum = 1;
      for (let i = 1; i < nums.length; i++) {
          if (nums[i] == maxItem + 1) {
              countNum++;
              maxNum = countNum > maxNum ? countNum : maxNum;
          } else if (nums[i] != maxItem) {
              countNum = 1;
          }
          maxItem = nums[i]
      }
      return maxNum;
  };

第二种

函数中接收一个数组nums作为参数,首先将数组转换为Set数据结构,并定义一个变量max用于保存最长连续子序列的长度。接着遍历Set中的每个元素num,如果Set中不存在num-1,说明num是一个连续子序列的起始数字。定义一个变量curMax初值为1,表示以num为起始数字的连续子序列长度为1。接着进入while循环,当num+curMax也存在于Set中时,说明连续子序列仍然在继续,将curMax自增1。当num+curMax不在Set中时,说明连续子序列到此结束。将max更新为当前curMax和max中的较大值。遍历结束后,max中保存的就是最长连续子序列的长度。将其返回即可

   var longestConsecutive = function(nums) {
      let set = new Set(nums), max = 0;
      for (num of set) {
          if (!set.has(num - 1)) {
              let curMax = 1;
              while(set.has(num + curMax)) {
                  curMax ++;
              }
              max = Math.max(max, curMax)
          }
      }
      return max
  };

坚持努力,无惧未来!