题目:
描述
给定一个未排序的整数数组,找出最长连续序列的长度。
说明
要求你的算法复杂度为O(n)
样例
给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4
分析:
由题可以看出要求时间复杂度为O(n),所以排序不能使用。想到使用hashset数据结构保存数组元素,然后依次遍历数组,对于每一个数组元素,分别找到其下一个元素right和上一个元素left。以上一个元素为例,去hashset中判断是否存在该元素,如果存在,则继续找上一个元素,直到hashset中不存在该元素,返回left。同理判断下一个元素,最后返回right。然后用maxlen保存当前最长长度Max(maxlen,right-left-1),因为right和left是后判断,以100为例,上一个为99,下一个为101,set中都不存在,所以最长长度应该为101-99-1为1.
public int longestConsecutive(int[] num) {
// write your code here
if(num.length==0 || num==null) return 0;
HashSet<Integer> set=new HashSet<>();
for(Integer i:num){
set.add(i);
}
int maxLen=0;
for(int i=0;i<num.length;i++){
if(set.contains(num[i])) {
set.remove(num[i]);
int left = num[i] - 1;
int right = num[i] + 1;
while(set.contains(left)){
set.remove(left);
left--;
}
while(set.contains(right)){
set.remove(right);
right++;
}
if(maxLen<right-left-1){ //比如num[i]=100,left=99,right=101,set中没有,则最后maxlen应该为1,即right-left-1.因为是先减再while判断的
maxLen=right-left-1;
}
}
}
return maxLen;
}