【LeetCode Hot 100】 最长连续序列

最长连续序列问题解析

问题描述

给定一个未排序的整数数组 nums,请找出其中数字连续的最长序列的长度。注意:

  • 序列中的数字不需要在原数组中连续出现
  • 要求算法的时间复杂度为 O(n)

示例分析

示例1

输入:[100,4,200,1,3,2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4]

示例2

输入:[0,3,7,2,5,8,4,6,0,1]
输出:9
解释:完整序列 [0,1,2,3,4,5,6,7,8]

示例3

输入:[1,0,1,2]
输出:3
解释:序列 [0,1,2]

解题思路

核心思想

利用哈希集合实现O(1)时间复杂度的查找,通过识别序列起点来避免重复计算。

算法步骤

  1. 预处理:将所有数字存入哈希集合
  2. 寻找起点:对于每个数字,检查是否是某个连续序列的起点
  3. 扩展序列:从起点向后扩展,统计序列长度
  4. 维护最大值:记录遇到的最长序列

代码实现

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        
        unordered_map<string, vector<string>> mp;   //哈希表
        for (const auto& s : strs)      // 处理每一个字符串
        {
            string key = s;         // 字符串的拷贝
            sort(key.begin() , key.end());  // 排序
            mp[key].emplace_back(s);        // 把键相同的放到同一个字符串集合中
        }
        vector<vector<string>> ans;
        // 遍历哈希表,直接插入它的值,(值是数组)
        for (auto it = mp.begin() ; it != mp.end() ; it++)
        {
            ans.emplace_back(it->second);
        }
        return ans;
    }
};

复杂度分析

指标 复杂度 说明
时间复杂度 O(n) 每个元素最多被访问两次
空间复杂度 O(n) 需要存储所有元素的哈希集合

关键点说明

  1. 序列起点判断:通过检查num-1是否存在,确保每个序列只被处理一次
  2. 哈希集合优势:相比排序法(O(nlogn)),哈希法可以保持O(n)时间复杂度
  3. 边界处理:自动处理空数组和重复元素的情况

提示:在实际面试中,建议先说明暴力解法,再逐步优化到哈希解法,展示思考过程。

posted on 2025-05-18 10:28  无穷小学弟  阅读(46)  评论(0)    收藏  举报

导航