JS算法-最长连续序列

简介: JS算法-最长连续序列

题目


给定一个未排序的整数数组 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
  };
相关文章
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
79 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
3月前
|
JavaScript 前端开发
JavaScript写的序列代码生成器
JavaScript写的序列代码生成器
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
3月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
186 19
|
3月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
4月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
325 1
|
4月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
80 1
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
199 1