给定一个未排序的整数数组 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
提示:
题目信息:复杂度 O(n)
暴力遍历,每个数 n 去匹配 n+1 直到匹配不到,复杂度 O(n2k)
通过哈希缓存数组,匹配 n+1 时复杂度降低为 1,复杂度为 O(nk)
使用哈希匹配时,当已经有长度时,仅需要匹配比它长的,复杂度为 O(n)
思路三的问题是仅跳过会匹配中断的,而不跳过就会复杂度超出,所以需要跳转 保证每个数是起点就好了,因为 x-x+n 肯定大于 x+1-x+n
function longestConsecutive(nums: number[]): number {
const map: Record<string, boolean> = {}
let res = 0
// 录入哈希
for (let i = 0; i < nums.length; i++) {
map[nums[i]] = true
}
// 遍历nums,对每个num找num+1,num+2直到找不到,并且保证每个数是起点,因为x-x+n肯定大于x+1-x+n
for (let i = 0; i < nums.length; i++) {
let count = 100000
let nextNum = nums[i] + 1
let preNum = nums[i] - 1
let length = 1
while (!map[preNum] && map[nextNum] && count) {
length++
count--
nextNum++
}
res = res > length ? res : length
}
return res
}