1、前言
题目描述2、思路
使用最原始的排序思路,时间复杂度为 nlogn。因为题目不要求序列在数组中连续,所以极端情况下可以将整个数组作为一个整体,然后排序,针对相等的数跳过;针对两个数前后差值为1,则加1;否则 len 重置。
或者使用 hashmap。
3、代码
class Solution {
public int longestConsecutive(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
Arrays.sort(nums);
int maxLength = 0, len = 1;
for (int i = 1; i < nums.length; i++) {
maxLength = Math.max(maxLength, len);
if(nums[i] - nums[i - 1] == 1){
len++;
}else if(nums[i] - nums[i - 1] == 0){
continue;
}else {
len = 1;
}
}
return Math.max(maxLength, len);
}
}
public int longestConsecutive(int[] nums) {
if(nums == null || nums.length == 0){
return 0;
}
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
int max = 0;
for (int num : nums) {
// 如果有比自己小的,让小的先来,最终会找到每个阶段的小的
if(set.contains(num - 1)){
continue;
}
// 每个阶段的小的找到了,现在看能连续到多少
int r = num;
while (set.contains(r + 1)){
r++;
}
max = Math.max(max, r - num + 1);
}
return max;
}
网友评论