给定一个未排序的整数数组 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
提示:
<= nums.length <=
<= nums[i]<=
分析:本题的连续序列是唯一的,为避免重复遍历,可以先找到每个连续序列的第一个值,随后利用集合依次找寻后面是否还有值,并实时记录当前序列的长度,在遍历完整个连续序列后,更新答案即可。
C++利用set进行遍历存储,代码如下:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 初始化结果大小为0,用于记录最长的连续序列长度
int resultSize = 0;
// 创建一个集合,用于存储数组中的所有数字,集合会自动去重
set<int> num_set;
// 使用数组的迭代器范围将所有元素插入到集合中
num_set.insert(nums.begin(), nums.end());
// 遍历集合中的每个数字
for (auto num : num_set) {
// 如果当前数字的前一个数字不在集合中,说明当前数字是一个新的序列的开始
if (num_set.find(num - 1) == num_set.end()) {
// 将当前数字赋值给currentNum,用于后续的序列长度计算
int currentNum = num;
// 初始化当前序列长度为1,因为至少包含当前数字
int currentSize = 1;
// 当当前数字的后一个数字在集合中时,继续向后寻找,直到找到一个不存在的数字
while (num_set.find(currentNum + 1) != num_set.end()) {
// 移动到下一个数字
currentNum++;
// 当前序列长度加1
currentSize++;
}
// 更新结果大小,取当前序列长度和已有结果大小的较大值
resultSize = max(resultSize, currentSize);
}
}
// 返回最终计算出的最长连续序列的长度
return resultSize;
}
};
python代码实现如下:
class Solution(object):
def longestConsecutive(self, nums):
# 如果输入的数组为空,直接返回0,因为没有元素可以形成序列
if not nums:
return 0
# 初始化结果大小为0,用于记录最长的连续序列长度
resultSize = 0
# 将数组转换为集合,以便快速判断一个数是否在数组中
num_set = set(nums)
# 遍历集合中的每个数字
for num in num_set:
# 如果当前数字的前一个数字不在集合中,说明当前数字是一个新的序列的开始
if num - 1 not in num_set:
# 将当前数字赋值给current_num,用于后续的序列长度计算
current_num = num
# 初始化当前序列长度为1,因为至少包含当前数字
current_size = 1
# 当当前数字的后一个数字在集合中时,继续向后寻找,直到找到一个不存在的数字
while current_num + 1 in num_set:
# 移动到下一个数字
current_num = current_num + 1
# 当前序列长度加1
current_size = current_size + 1
# 更新结果大小,取当前序列长度和已有结果大小的较大值
resultSize = max(current_size, resultSize)
# 返回最终计算出的最长连续序列的长度
return resultSize