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.
本算法时间复杂度为O(nlogn),也能过。
public class Solution {
public int longestConsecutive(int[] num) {
if(num.length==0||num.length==1) return num.length;
Arrays.sort(num);
int max=1;
int temp=1;
for(int i=1;i<num.length;i++){
if(num[i]-1==num[i-1]) temp++;
else if (num[i]==num[i-1]) continue;
else temp=1;
if(temp>max) max=temp;
}
return max;
}
}
下面的算法时间复杂度为O(n),使用HashSet,在查找某数的左右是否存在时,将其删除,避免全为降序或者顺序的情况退化为O(n^2)。
public int longestConsecutive(int[] num) {
if (num.length == 0 || num.length == 1)
return num.length;
HashSet<Integer> hashset = new HashSet<Integer>();
for (int i = 0; i < num.length; i++) hashset.add(num[i]);
int result = 0;
for (int i = 0; i < num.length; i++) {
int tmplen = 1;
int tmpnum = num[i] + 1;
while (hashset.contains(tmpnum)) {
hashset.remove(tmpnum);
tmplen++;
tmpnum++;
}
tmpnum = num[i] - 1;
while (hashset.contains(tmpnum)) {
hashset.remove(tmpnum);
tmplen++;
tmpnum--;
}
if (tmplen > result) result = tmplen;
if (result >= num.length) break;
}
return result;
}