力扣第128题 最长连续序列 c++暴力简单易懂
题目
中等
给定一个未排序的整数数组 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. 首先,对输入的数组进行排序,将数组元素按照升序排列。
2. 接下来,初始化最长连续序列长度为1,当前连续序列长度为1。
3. 如果数组为空,则最长连续序列长度为0,直接返回。
4. 如果数组只有一个元素,则最长连续序列长度为1,直接返回。
5. 对排序后的数组进行遍历,从第一个元素开始。
6. 如果当前元素的下一个元素与当前元素连续(差值为1),则将当前连续序列长度加1。
7. 如果当前元素的下一个元素与当前元素相等,则跳过判断继续下一次循环。
8. 如果当前元素的下一个元素与当前元素不连续,则将当前连续序列长度重置为1。
9. 在遍历的过程中,通过比较当前连续序列长度和最长连续序列长度,更新最长连续序列长度。
10. 遍历完成后,返回最长连续序列长度作为结果。
- 总体思路就是先对数组排序,然后遍历数组,通过比较相邻元素判断是否连续,同时更新最长连续序列长度。
# 解题方法
> 详解在代码中OvO
# 复杂度
- 时间复杂度:
> O(nlogn)
其中 n 是输入数组的长度。这是因为你使用了排序操作 (sort(nums.begin(), nums.end())),而排序算法的时间复杂度通常为O(nlogn)。
- 空间复杂度:
> O(1)
因为你没有使用额外的数据结构来存储中间结果,只使用了几个变量来记录最长连续序列的长度。

c++代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 初始化最长连续序列长度为1,当前连续序列长度为1
int maxLen = 1, curLen = 1;
// 将数组进行排序
sort(nums.begin(), nums.end());
// 如果输入数组为空,则最长连续序列长度为0
if (nums.empty()) {
return 0;
// 如果输入数组只有一个元素,则最长连续序列长度为1
if (nums.size() == 1) {
return 1;
// 遍历数组
for (int i = 0; i < nums.size() - 1; i++) {
// 如果当前元素的下一个元素是连续的
if (nums[i + 1] == nums[i] + 1)
curLen++; // 当前连续序列长度加1
// 如果当前元素的下一个元素相等
else if (nums[i + 1] == nums[i])
continue; // 跳过相等的元素
// 如果当前元素的下一个元素不连续
else curLen = 1; // 当前连续序列长度重置为1
// 更新最长连续序列长度
maxLen = max(maxLen, curLen);
}
return maxLen; // 返回最长连续序列长度
}
};
# Code
```C++ []
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 初始化最长连续序列长度为1,当前连续序列长度为1
int maxLen = 1, curLen = 1;
// 将数组进行排序
sort(nums.begin(), nums.end());
// 如果输入数组为空,则最长连续序列长度为0
if (nums.empty()) {
return 0;
// 如果输入数组只有一个元素,则最长连续序列长度为1
if (nums.size() == 1) {
return 1;
// 遍历数组
for (int i = 0; i < nums.size() - 1; i++) {
// 如果当前元素的下一个元素是连续的
if (nums[i + 1] == nums[i] + 1)
curLen++; // 当前连续序列长度加1
// 如果当前元素的下一个元素相等
else if (nums[i + 1] == nums[i])
continue; // 跳过相等的元素
// 如果当前元素的下一个元素不连续
else curLen = 1; // 当前连续序列长度重置为1
// 更新最长连续序列长度
maxLen = max(maxLen, curLen);
}
return maxLen; // 返回最长连续序列长度
}
};
```
浙公网安备 33010602011771号