给定一个未排序的整数数组,找出最长连续序列的长度。
说明
要求你的算法复杂度为O(n)
样例
给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4
思路
我们在判断某个数的连续序列时,会分别往减小和增大的方向找下一个连续数在不在数组中。那么我们如何判断我们要寻找的下一个数在不在数组中呢?我们可以先建立一个HashSet,先用HashSet消除数组中的重复元素(相同的两个数只能使连续序列的长度+1),然后查找HashSet中是否包含我们要寻找的下一个元素,包含则长度+1,继续往下寻找,不包含则这个寻找方向就没办法继续了。最后把两个方向的长度加起来即为包含该数的一个连续序列。
代码
public class Solution {
/**
* @param nums: A list of integers
* @return an integer
*/
public int longestConsecutive(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
set.add(nums[i]);
}
int longest = 0;
for (int i = 0; i < nums.length; i++) {
int down = nums[i] - 1;
while (set.contains(down)) {
// 同一序列中的所有元素,不管从哪个开始进行down和up的查找,找到的最终都是同一个序列,为了避免重复运算,要移除set中已经查过的down和up
set.remove(down);
down--;
}
int up = nums[i] + 1;
while (set.contains(up)) {
set.remove(up);
up++;
}
// 注意上面多执行了一次down--,所以此次要用up - (down + 1)
longest = Math.max(longest, up - down - 1);
}
return longest;
}
}