力扣第128题 最长连续序列 c++暴力简单易懂

题目

128. 最长连续序列

中等

给定一个未排序的整数数组 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; // 返回最长连续序列长度

    }

};

```

posted @ 2023-09-10 08:00  lenyan~  阅读(122)  评论(0)    收藏  举报  来源