题目
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
跳转链接:LeetCode128
解析
本题要求我们在给出的数组中找出最长的连续的序列。
解法一
我们可以给数组排序后用一个 int 类型来存储连续序列的长度同时使用一个 int 类型来存储连续序列的最大值。当遍历数组时,如果元素是连续递增的我们就不断增加连续序列的长度同时修改最大值;如果不连续递增的话我们就重新计算连续序列。
public class Solution {
public int longestConsecutive(int[] nums) {
if (nums.length == 0){
return 0;
}
Arrays.sort(nums);
//length用于记录当前连续序列的长度
//n用于记录当前连续序列的最大值
//由于开始排除了nums长度为0的情况所以我们可以直接给ans赋值为1
int length = 1, n = nums[0], ans = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == n + 1){
//序列长度增加
length++;
n = nums[i];
ans = Math.max(ans, length);
}
else if(nums[i] > n + 1){
//重置序列长度
length = 1;
n = nums[i];
}
}
return ans;
}
}
解法二
我们可以使用 set 来去除重复的元素,通过 set 的 contains 方法来查找连续序列的下一个元素,如果存在,则增加连续序列的长度;如果不存在,则重新计算连续序列。
public class Solution {
public int longestConsecutive(int[] nums) {
int ans = 0, length;
//使用set去除重复的元素
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
for (int num : set){
//这句if判断是保证时间复杂度为O(n)的关键
if(!set.contains(num - 1)){
length = 1;
while(set.contains(num + 1)){
num++;
length++;
}
ans = Math.max(ans, length);
}
}
return ans;
}
}
416

被折叠的 条评论
为什么被折叠?



