题目
给定一个未排序的整数数组 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
};
坚持努力,无惧未来!