「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) **的算法解决此问题。
示例 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
解题思路
- 我们先将传入的数组进行去重(使用
Set) - 依次遍历去重后的
set数组 - 初始化每一项连续长度初始值为
1(自身) - 拿到遍历到的元素的左边元素以及右边元素的值
- 查看
set数组中是否存在左边/右边的数值 - 如果存在那么
len++,左侧元素数值--,右侧的++ - 重复上面的操作直到找不到为止
- 更新最大值(毕竟最大值与当前连接的长度,取其中较大的)
- 返回最大值,完成题解
解题代码
var longestConsecutive = function(nums) {
let set = new Set(nums) // 数组去重
let max_len = 0 // 初始化最大长度
for(let num of set){
let len = 1
let left = num - 1 // 初始化连续后在当前元素左侧的数
let right = num + 1 // 初始化连续后在当前元素右侧的数
while (set.has(left)){
set.delete(left) // 去除已经连续过的元素,减少循环次数
left-- // 继续寻找比当前元素小`1`的数
len++
}
while (set.has(right)){
set.delete(right) // 去除已经连续过的元素,减少循环次数
right++ // 继续寻找比当前元素大`1`的数
len++
}
max_len = Math.max(max_len,len) // 更新最大值
}
return max_len
};
不知道是越来越独立,还是越来越心虚,走了这么久,发现唯一靠得住的还是自己,只有你把自己变好了,你足够强大了,才不会在意他人。
如有任何问题或建议,欢迎留言讨论!