1 前言
翻译成大白话:例如nums = [100,4,200,3,1,2]; 其最长连续序列为4, 也就是[1,2,3,4];
2 算法步骤
方法一
【第一步】由于数组是无序的,我们可以对其进行排序。
【第二步】由于排序后,nums 变为[1,2,3,4,100,200]。如何寻找最长的连续序列呢?
其实就是nums[i-1] + 1 ==nums[i]。
【第三步】细节处理,可能会存在[1,2,2,3,4,100,200]重复的数字。因此可以使用利用continue。
如果nums[i-1]==nums[i]则continue。
具体代码
public int longestConsecutive2(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
}
Arrays.sort(nums);
int max = 1;
int res = 1;
for (int i = 1; i < n; i++) {
if (nums[i] == nums[i-1]) {
continue;
}
if (nums[i] == nums[i-1] +1){
max++;
res = Math.max(res,max);
} else {
max = 1;
}
}
return res;
方法二
借助set进行去重。
【第一步】借助set进行去重,但是set里面数字是无序的。
【第二步】遍历数组。核心代码如下
// 遍历去重和后的set
for (int num : set) {
int cur = num;
// 只有当num -1 不存在,才开始向后遍历。
if (!set.contains(cur - 1)) {
while (set.contains(cur + 1)) {
cur++;
}
}
// [num,cur]之间是连续的。记录长度
ans = Math.max(ans, cur - num + 1);
}
return ans;
具体代码
public int longestConsecutive(int[] nums) {
// 建立一个存储所有数的哈希表,同时起到去重功能
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
int ans = 0;
// 遍历去重和后的set
for (int num : set) {
int cur = num;
// 只有当num -1 不存在,才开始向后遍历。
if (!set.contains(cur - 1)) {
while (set.contains(cur + 1)) {
cur++;
}
}
// [num,cur]之间是连续的。
ans = Math.max(ans, cur - num + 1);
}
return ans;
}