给定一个未排序的整数数组 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 <= 105
-109 <= nums[i] <= 109
-
思路一:首先排个序,然后双指针思路。当前的数减去前一个数等于一,temp++。相等就继续。不相等就更新结果,temp重新赋值为1。
-
思路二:将所有的值加入到set中,去重。然后遍历set元素,判断当前元素是否为第一个开头的元素(num-1是否在集合中),为开头,从当前元素值开始加一,直到值不在set中。
-
思路三:直接使用TreeSet。将所有元素值加入TreeSet中,遍历,取出当前值,当前值和前一个值相差为一,temp++,不为1,更新结果。
c
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length==0)return 0;
if(nums.length==1)return 1;
Arrays.sort(nums);
int start = 0;
int maxLen = 0;
int i = 0;
int temp = 1;
for(i = 0;i<nums.length;i++){
if(i==0){
continue;
}else if(nums[i]-nums[i-1]==1){
temp++;
}else if(nums[i]!=nums[i-1]){
maxLen = Math.max(maxLen, temp);
temp = 1;
}
}
return Math.max(maxLen,temp);
}
}
c
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> s = new HashSet<>();
for(int i = 0; i < nums.length; i++){
s.add(nums[i]);
}
int maxLen = 0;
for(int x:s){
// 当前元素为一个序列的开头元素
if(!s.contains(x-1)){
int t = x+1;
// 值加一判断是否在集合中
while(s.contains(t)){
t++;
}
// 更新结果
maxLen = Math.max(maxLen, t-x);
}
}
return maxLen;
}
}
c
class Solution {
public int longestConsecutive(int[] nums) {
TreeSet<Integer> treeSet = new TreeSet<>();
for(int i = 0;i<nums.length;i++){
treeSet.add(nums[i]);
}
int temp = 0;
Integer pre = Integer.MIN_VALUE;
Integer maxLen = 0;
for(Integer x:treeSet){
if(x-pre==1){
temp++;
}else{
maxLen = Math.max(maxLen, temp);
temp = 1;
}
pre = x;
}
return Math.max(maxLen,temp);
}
}