文章目录
- [1. 题目描述](#1. 题目描述)
- [2. 思路](#2. 思路)
- [3. 代码](#3. 代码)
1. 题目描述
给定一个未排序的整数数组nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
示例 3:
输入:nums = [1,0,1,2]
输出:3
提示:
- 0 <= nums.length <= 10^5
- -10^9 <= nums[i] <= 10^9
2. 思路
- 不考虑时间复杂度解法:
- 对数组排序,按照指针法持续比较相邻两位数字的大小,是否满足
nums[j-1] + 1 == nums[j] - 考虑数组长度为0和1的边界情况。
- 对数组排序,按照指针法持续比较相邻两位数字的大小,是否满足
- O(n)解法:
- 结合示例3和题干要求------不要求序列元素在原数组中连续,那么只要存在连续的数字就可以了,可以对数组去重(结合set的特性)。
- 找到连续序列的起点(判断set中是否有比当前数字更小的),如果没有可以确定是起点。
- 后续持续判断是否存在比当前数字大1的,有就更新长度。
3. 代码
- 不考虑时间复杂度:
java
public int longestConsecutive(int[] nums) {
ArrayList<Integer> lens = new ArrayList<>();
Arrays.sort(nums);
if (nums.length == 1) {
return 1;
}
for (int i = 0; i < nums.length; i++) {
int count = 1;
for (int j = i+1; j < nums.length; j++) {
if (nums[j-1] + 1 == nums[j]) {
count ++;
} else if (nums[j] == nums[j-1]) {
if (j == nums.length-1) {
lens.add(count);
}
continue;
} else {
lens.add(count);
break;
}
if (j == nums.length-1) {
lens.add(count);
}
}
}
Collections.sort(lens);
return lens.isEmpty() ? 0:lens.get(lens.size()-1);
}
- O(n)解法:
java
public int longestConsecutive2(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int len = 0;
for (Integer num : numSet) {
if (!numSet.contains(num-1)) {
//可以确定为起点
int currentNum = num;
int currentLen = 1;
while (numSet.contains(currentNum + 1)) {
currentLen ++;
currentNum ++;
}
len = Math.max(len, currentLen);
}
}
return len;
}
以上为个人学习分享,如有问题,欢迎指出:)