一、题目描述
给定一个未排序的整数数组 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 <= 10^5
- -10^9 <= nums[i] <= 10^9
二、我的想法
- 将数组先去重,然后排序。初始化两个变量,一个为最大长度 maxLen 设为1,因为除了空数组外,最小是1;一个是 tmp 变量,为了计算长度,作为中间变量,初始值也为1。
- 遍历排序后的数组,如果当前元素比前一个元素大 1,则说明连续,tmp += 1,同时更新最大长度值,maxLen = max(maxLen, tmp);如果当前元素不比前一个元素大,则不连续,将 tmp 重新置为 1。
- 最后返回 maxLen。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if not nums:
return 0
nums = list(set(nums))
nums.sort()
maxLen = 1
tmp = 1
for i in range(1, len(nums)):
if nums[i] == nums[i-1] + 1:
tmp += 1
maxLen = max(maxLen, tmp)
else:
tmp = 1
return maxLen
三、其他人的题解
看了下 灵茶天师府 的题解 并查集,一模版多解题,没太看懂,晚上看看视频,先记录一下。
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
nums = set(nums) #去重
ans = 0
###并查集模版:
#此处值是离散的,使用字典
fa = {num: num for num in nums} #储存每个节点的root,初始化为自己
size = {num : 1 for num in nums} #储存以当前节点为root的节点数量
#初始化只有自己一个节点
def find(x):
if fa[x] != x:
fa[x] = find(fa[x])
return fa[x]
def merge(f, to):
f = find(f)
to = find(to)
if f != to :
fa[f] = to
size[to] += size[f]
#遍历数组,当满足合并关系时,做merge,最后取最大值即题解
for num in nums:
if num + 1 in fa:
merge(num, num+1)
if size:
ans = max(size.values())
return ans