给定一个未排序的整数数组,找出最长的连续元素序列的长度。
例如,
给定[100,4,200,1,3,2]
最长的连续元素序列是[1,2,3,4]。
返回其长度:4。
您的算法应该在O(n)复杂度下运行。
首先将数组的数据用hash表进行存放。这样查找每一个元素的时间复杂度就是O(1);
每次从数组中取出一个元素,然后在从该元素左右相邻元素在hash表中搜索。并记录该元素最长的相邻数目,并且将这些元素从hash表里删除。(这样保证删除所有的元素只遍历一次,最后总的就是O(n))
public int longestConsecutive(int[] num) {
Set<Integer> nums = new HashSet<>(num.length);
// 将数组中的元素添加到hash表中
for (int number : num)
nums.add(number);
int resLenMax = 0;
for (int i = 0; i < num.length && nums.size() > 0; i++) {
int number = num[i];
// 尝试删除当前元素,如果删除失败,就查找下一个元素
if (!nums.remove(number))
continue;
int len = 1;
int left = number - 1;
int right = number + 1;
// 尝试删除左相邻值,如果删除成功对应长度+1,并且继续尝试
while (nums.remove(left)) {
len = len + 1;
left = left - 1;
}
// 尝试删除右相邻值,如果删除成功对应长度+1,并且继续尝试
while (nums.remove(right)) {
len = len + 1;
right = right + 1;
}
// 判断当前搜索值的相邻长度是否大于目前最大长度,如果大于,则更新
if (len > resLenMax)
resLenMax = len;
}
return resLenMax;
}