概述
给定一个未排序的整数数组 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
解题思路
1.哈希表
2.并查集
解题代码
1.哈希表
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int num:nums){
set.add(num);
}
int res=0;
for (int num:set){
int cur=num;
if (!set.contains(cur-1)) {
while (set.contains(cur+1)){
cur++;
}
}
res=Math.max(res,cur-num+1);
}
return res;
}
}
2.并查集
class Solution {
public int longestConsecutive(int[] nums) {
UnionFind unionFind=new UnionFind();
unionFind.init(nums);
for (int num:nums){
unionFind.merge(num,num+1);
}
int ans=0;
for (Integer key:unionFind.parent.keySet()){
ans=Math.max(ans, unionFind.find(key)-key+1);
}
return ans;
}
}
class UnionFind{
Map<Integer,Integer> parent;
public void init(int[] nums){
parent=new HashMap<>();
for (int num:nums){
parent.put(num,num);
}
}
public int find(int num){
int root=num;
while (root!=parent.get(root)){
root=parent.get(root);
}
while (num!=parent.get(num)){
int cur=num;
num=parent.get(num);
parent.put(cur,root);
}
return root;
}
public void merge(int num1,int num2){
if (!parent.containsKey(num1)||!parent.containsKey(num2))return;
int parent1=find(num1),parent2=find(num2);
parent.put(parent1,parent2);
}
}