Leetcode-128.[最长连续序列]

17 阅读1分钟

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

方法一: set

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if (nums.empty()) return 0; // 边界:空数组直接返回0
        set<int> s(nums.begin(), nums.end());
        int max_count = 1;
        int count = 1;
        auto it = s.begin();
        int prev = *it; // 保存前一个元素
        ++it; // 从第二个元素开始遍历
        
        while (it != s.end()) {
            int curr = *it;
            if (curr == prev + 1) { // 当前元素是前一个+1,连续
                count++;
                max_count = max(max_count, count);
            } else { // 不连续,重置计数
                count = 1;
            }
            prev = curr; // 更新前一个元素
            ++it; // 迭代器正常步进
        }
        
        return max_count;
    }
};

方法二:哈希

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.empty()) return 0;
        unordered_set<int> s(nums.begin(),nums.end());
        int max_count=1;
        
        for(int num:s){
            // 只有num是连续序列的起点(num-1不存在),才开始计数
            if(s.find(num-1) == s.end()){
                int cur = num;
                int cur_count=1;

                while(s.find(cur+1) !=s.end()){
                    cur++;
                    cur_count++;
                }
                max_count = max(max_count,cur_count);
            }
        }
        
        return max_count;
    }
};

两种解法对比

解法时间复杂度空间复杂度优势
基础版(set)O(nlogn)O(n)逻辑简单,易理解
最优版(哈希表)O(n)O(n)时间效率更高,面试推荐