由于Hash表查找效率为O(1),所以我们可以这么做:
1、把nums数组加入到Hash表;
2、从每个元素开始判断当前的元素是否为序列的开始,即判断Hash中有没有比当前小1的元素;
3、从开始的元素一直查找Hash表内比当前元素大1的元素,直到找不到这样的元素;
4、更新最长序列长度,从下一个元素再开始判断。。。
代码如下:
public int longestConsecutive(int[] nums) {
//判断临界
if(nums == null || nums.length == 0)
{
return 0;
}
HashSet<Integer> hashSet = new HashSet<>();
//nums数组加入到Hash
for(int num : nums){
hashSet.add(num);
}
//保存全局最长序列的长度
int longsequence = 0;
for(int num : hashSet){
//如果是最开始的那个数字
if(!hashSet.contains(num-1)){
int currentnum = num;
//当前长度从1开始
int currentlen = 1;
//找大1的元素
while(hashSet.contains(currentnum+1)){
currentlen++;
currentnum++;
}
//更新长度
longsequence = Math.max(currentlen,longsequence);
}
}
return longsequence;
}