题目描述:
给定一个未排序的整数数组 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
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
解题思路:
连续的关键就是在于两个元素之间的差值等于1,难点是在于定位初始元素在哪里。从哪里来的就到哪里去嘛,还是根据两个元素之间的差值等于1定位,假设初始值为i,那么i-1不在列表或数组之中,就代表i为初始元素。然后再不断判断i+1是否在列表或数组中,那s记录即可。看代码吧
实现代码:
python代码:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if not nums:
return 0
# 将数组转换为集合,以便快速查找元素
num_set = set(nums)
result_count = 0
for num in num_set:
# 如果 num - 1 不在集合中,说明 num 可能是连续序列的起点
if num - 1 not in num_set:
current_num = num
current_streak = 1
#扩展以 num 为起点的连续序列
while current_num +1 in num_set:
current_num +=1
current_streak+=1
result_count = max(current_streak,result_count)
return result_count
java代码:
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for(int num:nums){
num_set.add(num);
}
int count_result = 0;
for(int num:num_set){
if(!num_set.contains(num-1)){
int current_num = num;
int current_streak = 1;
while(num_set.contains(current_num+1)){
current_num+=1;
current_streak+=1;
}
count_result = Math.max(current_streak,count_result);
}
}
return count_result;
}
}