题干:
思路:
如果对时间复杂度没有要求的话,可以先排序,再一段一段地找,这样的好处是空间占用小。
如果希望On的话,那就采取设置一个Set的方法,这样空间复杂度是On,但是时间复杂度降到On(如果是常规做法,排序时间复杂度至少是Onlogn)
set的作用就是一遍预处理读入全部数字,遍历的时候找到每一个可能的递增序列中的最小数,然后不断地加1向后找,维护一个longest作为结果。
代码:
class Solution {
public int longestConsecutive(int[] nums) {
int length = nums.length;
Set<Integer> set = new HashSet<Integer>();
for( int i :nums){
set.add(i);
}
int longest = 0;
//下面进行查找,首先是查找当前这个值是不是没有前一个数,如果有就可以直接跳过(这段是为了筛掉那些不是序列中最小数的)
for(int i :set){
if(!set.contains(i-1)){
int currentNum = i;
int currentLength = 1;
while(set.contains(currentNum+1)){
currentNum++;
currentLength++;
}
longest = Math.max(longest,currentLength);
if(longest==length){
break;
}
}
}
return longest;
}
}