题目
给定一个未排序的整数数组 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 };