难度:中等
给定一个未排序的整数数组 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
思路:
- 用TreeSet收集数据,TreeSet中的数据天然有序;
- 把TreeSet中的数据放入数组中用于判断连续的序列
- 找到最长连续序列
class Solution {
public int longestConsecutive(int[] nums) {
// 判断特殊情况 nums 为 []
if(nums.length == 0) return 0;
// 用TreeSet收集nums中的元素
TreeSet<Integer> treeSet = new TreeSet<>();
for(int i = 0;i<nums.length;i++){
treeSet.add(nums[i]);
}
// 把TreeSet中的元素转为数组用于后续判断
int[] arr = new int[treeSet.size()];
int i = 0;
for(int ts : treeSet){
arr[i] = ts;
i++;
}
// 更新结果,因为连续序列长度至少为1(如果nums中有元素),所以max初始值为1
int max = 1,res = 0;
for(i = 1;i<arr.length;i++){
if(arr[i] - arr[i-1] == 1){
max++;
}else{
if(max > res) {
res = max;
}
max = 1;
}
}
if(max > res) {
res = max;
}
return res;
}
}