128.最长连续序列
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
给定一个未排序的整数数组 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、把数组nums的所有元素存到hashset中。
2、遍历数组nums,明确连续序列的起点,对于数组nums中的元素num,如果num - 1不在hashset中,就把num作为一个连续序列的起点,进入步骤3。
3、从连续序列的起点num开始,不断去hashset中寻找num + i,i >= 1。直到num + len不在hashset中(以num为起点的序列此后就不再连续),更新最长连续序列的长度max_len = max(max_len, len)。如果数组nums已遍历完,进入步骤4,否则进入步骤2。
4、返回max_len。
class Solution {
public:int longestConsecutive(vector<int>& nums) {int max_len = 0;unordered_set<long long> nums_set;int nums_len = nums.size();//把所有的元素保存在set中for (int i = 0; i < nums_len; ++i) {nums_set.emplace(nums[i]);}for (auto& num:nums) {//num-1不在set中 保证num是连续序列的起始元素if (nums_set.find(num - 1) == nums_set.end()) {int len = 0;//num+len在set中 说明num~num+len是连续的while (nums_set.find(num + len) != nums_set.end()) {++len;max_len = max(len, max_len);}}}return max_len;}
};
ps:
GPT4O逐句解析
初始化变量:
int max_len = 0: 初始化变量 max_len,用于记录最长连续序列的长度。
unordered_set nums_set: 创建一个 unordered_set,用于存储数组中的元素,并确保每个元素唯一且查找操作高效。
使用 long long 是为了避免整数溢出(尽管输入数据一般是 int,此处对潜在溢出进行保护)。
int nums_len = nums.size(): 获取输入数组的长度 nums_len,以避免多次调用 nums.size()。
将所有元素存入 unordered_set:
//把所有的元素保存在set中
for (int i = 0; i < nums_len; ++i) {
nums_set.emplace(nums[i]);
}
通过 for 循环,将 nums 中的每个元素添加到 nums_set 中,利用 unordered_set 实现 O(1) 的查找时间复杂度。
遍历 nums 数组:
for (auto& num : nums): 遍历 nums 中的每个元素,num 是当前元素的引用。
if (nums_set.find(num - 1) == nums_set.end()): 检查 num - 1 是否在 nums_set 中。如果 num - 1 不存在,说明 num 是一个连续序列的起始元素。
这一条件用于确保每个连续序列只从序列的起点开始扩展,避免重复计算。
计算当前连续序列的长度
int len = 0;
// num + len在set中 说明num~num + len是连续的
while (nums_set.find(num + len) != nums_set.end()) {
++len;
max_len = max(len, max_len);
}
int len = 0: 初始化 len 为 0,用于计算当前连续序列的长度。
while (nums_set.find(num + len) != nums_set.end()): 使用 while 循环检查 num + len 是否存在于 nums_set 中,说明从 num 开始是连续的。
++len: 增加 len,向后扩展当前的连续序列。
max_len = max(len, max_len): 更新 max_len,记录最长的连续序列长度。
最后返回max_len。