给定一个未排序的整数数组?
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
第一思路是:先将他们排序,之后找到最长的一段连续数字之后返回长度即可。emmm看着还是比较简单
实际书写遇到的问题
他会有多个数相同的情况,这个一般是会影响我们判断长度的就需要去重,自然就是用Set集合
之后怎么将Set集合转化为数组呢?
最笨的方式一个一个取出来,然后依次装入数组排序。不好,空间利用率低。
苦思冥想emmmm..............
可以直接在原来 的num中判断。当出现重复的数时直接跳过即可。判重还是用set.add(),他会返回一个boolean显示是否加入成功。
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length == 0) {
return 0;
}
// 用于判定元素是否重复
Set<Integer> set = new HashSet<>();
int length = 1;
int maxLength = 1;
// 排序
Arrays.sort(nums);
for(int i =1; i< nums.length; i++) {
// 当元素存在时, 保持length不变。
if( ! set.add(nums[i])) {
continue;
}
// 连续的元素: 翻译下:就是nums[i-1] + 1 = nums[i]
if(nums[i-1] + 1 == nums[i]) {
length ++;
// 当出现多串连续元素时, 取最大length: 。
maxLength = Math.max(length, maxLength);
}else{
length = 1;
}
}
return maxLength;
}
}
时间23ms, 空间63.37MB?
?