开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第43天,点击查看活动详情
题目描述
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
来源:力扣(LeetCode)
- 示例 1
输入: nums = [100,4,200,1,3,2]
输出: 4
解释: 最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
- 示例 2
输入: nums = [0,3,7,2,5,8,4,6,0,1]
输出: 9
提示:
0 <= nums.length <= 105-109 <= nums[i] <= 109
思路分析
根据题意可知,题目给出一个未排序的整数数组 nums ,需要在这个数组里面找出连续的最长序列的长度;啥是连续的,就是数值相差是1,其他的都不属于连续。并且也不要求是在原数组中连续,也就是说,可以给数组进行排序。
如果原有数组的长度是0,那么数字连续的最长序列的长度也是为0.
声明一个最大值max,计算变量index。先给数组nums排个序,方便后面操作运算。
这里有三种情况,第一种是如果当前元素和上一个元素的值相等,那么index不做计数。如果当前元素比上一个元素大于1,记住,是大于1,大于其他值都不行,然后计数index就加1。如果这两种情况都不是的话,就是属于第三种情况,当前元素可能大于上一个元素很多,也可能比上一个元素小,所以这里就需要取max和index的最大做第一个连续序列的长度,并将index重置为1。等循环结束,max就是连续的最长序列的长度。
AC代码
function solution(nums) {
if(nums.length === 0) {
return 0;
}
let max = -Infinity;
let index = 1;
nums.sort((a, b) => a - b);
for(let i=1; i<nums.length; i++) {
if(nums[i] == nums[i-1]) {
continue;
}else if(nums[i] === (nums[i-1] + 1)) {
index += 1;
}else{
max = Math.max(max, index);
index = 1;
}
}
console.log(max);
}
let nums = [0,3,7,2,5,8,4,6,0,1];
solution(nums);