longest-consecutive-sequence
题目描述
给定一个无序的整数类型数组,求最长的连续元素序列的长度。
例如:
给出的数组为[100, 4, 200, 1, 3, 2],
最长的连续元素序列为[1, 2, 3, 4]. 返回这个序列的长度:4
你需要给出时间复杂度在O(n)之内的算法
题目解析
题目要求在一个无序的数组中最长的有序数组的长度,并且时间复杂度为O(n)。
所以我们可以利用空间换时间的,使用一个Set集合存放当前的无序数组,再依次将当前数组中的元素从集合中取出(取的过程中查找当前数的连续数组是否存在当前集合,存在的话继续找连续数组,不存在则返回当前查找到的连续数组的长度与上一次查询的大小,中的最大值)。
原题地址
代码
import java.util.*;
public class Solution {
public int longestConsecutive(int[] num) {
HashSet<Integer>set = new HashSet<Integer>();
if(num.length <= 1){
return num.length;
}
for(int i : num){
set.add(i);
}
int max = 1;
for(int number : num){
if(set.remove(number)){//集合中存在当前元素
int val = number;
int sum = 1;
int val_small = val -1;//小于当前数下一个数
int val_max = val +1; //小于当前数的下一个数
while(set.remove(val_small)){//下一个连续的小数存在当前集合
val_small --;
sum++;
}
while(set.remove(val_max)){//下一个连续的大数存在当前集合
val_max ++;
sum++;
}
max = Math.max(max,sum);//比较之前的所有连续数之和和当前的连续数之和的大小
}
}
return max;
}
}