Hot100-Day24-T128最长连续序列

5 阅读1分钟

Day24[26/3/24]T128最长连续序列

给定一个未排序的整数数组 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

示例 3:

输入:nums = [1,0,1,2]
输出:3

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109

解题思路

先用哈希表(集合 set,而不是字典 map)把数组存起来,

然后这样子思考:你先检查一个元素是不是连续字串的开头

比如说,3 是不是开头,就看 2 这个元素在不在哈希表中,如果 2 存在那么 3 就不是开头,就没必要从 3 开始查这个连续子串有多长。如果不存在 2,那么 3 肯定是一个连续子串的开头,那么就检查有没有 4、5、6,检查到最后是几,那么一减不就是这个连续子串的长度么。然后统计一下全局最长就行了。

Code

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

class Solution
{
public:
    int longestConsecutive(vector<int> &nums)
    {
        int maxLength = 0;
        unordered_set<int> set;
        for (const auto &num : nums)
        {
            set.insert(num);
        }
        for (const auto &num : set)
        {
            if (set.count(num - 1))
            {
                // 如果num-1存在就不是开头直接退出
                continue;
            }
            else
            {
                // 如果num-1不存在,就是开头,统计长度!
                int count = 0;
                int temp_num = num;
                while (set.count(temp_num++))
                {
                    count++;
                }
                if (count > maxLength)
                {
                    maxLength = count;
                }
            }
        }
        return maxLength;
    }
};

auto main() -> int
{
    Solution sol;
    vector<int> nums{1, 2, 3, 4, 5, 9};

    cout << "result = " << sol.longestConsecutive(nums) << endl;
}