Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
方法一:Hash
public class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> set=new HashSet<Integer>();
for(int i=0;i<nums.length;i++){
set.add(nums[i]);
}
int re=0;
for(int i=0;i<nums.length;i++){
if(!set.contains(nums[i])) continue;
int left=nums[i]-1;
int right=nums[i]+1;
while(set.contains(left)){
set.remove(left);
left--;
}
while(set.contains(right)){
set.remove(right);
right++;
}
re=Math.max(re, right-left-1);
}
return re;
}
}
方法二:HashMap加上Union-Find:
public class Solution2 {
//Union-Find
public int longestConsecutive(int[] nums) {
if(nums.length==0) return 0;
ids=new int[nums.length+1];
size=new int[nums.length+1];
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
ids[i]=i;
size[i]=1;
map.put(nums[i],i);
}
for(int i=0;i<nums.length;i++){
if(map.get(nums[i])!=i) continue;
if(map.containsKey(nums[i]-1)){
union(i+1,map.get(nums[i]-1)+1);
}
if(map.containsKey(nums[i]+1)){
union(i+1,map.get(nums[i]+1)+1);
}
}
return re;
}
int[] ids;
int[] size;
int re=1;
public int find(int i){
while(i!=ids[i]){
ids[i]=ids[ids[i]];
i=ids[i];
}
return i;
}
public void union(int i,int j){
int iid=find(i);
int jid=find(j);
if(iid==jid) return;
ids[jid]=iid;
size[iid]+=size[jid];
re=Math.max(size[iid], re);
}
}