【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)时间复杂度的查找,通过识别序列起点来避免重复计算。
算法步骤
- 预处理:将所有数字存入哈希集合
- 寻找起点:对于每个数字,检查是否是某个连续序列的起点
- 扩展序列:从起点向后扩展,统计序列长度
- 维护最大值:记录遇到的最长序列
代码实现
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) | 需要存储所有元素的哈希集合 |
关键点说明
- 序列起点判断:通过检查
num-1是否存在,确保每个序列只被处理一次 - 哈希集合优势:相比排序法(O(nlogn)),哈希法可以保持O(n)时间复杂度
- 边界处理:自动处理空数组和重复元素的情况
提示:在实际面试中,建议先说明暴力解法,再逐步优化到哈希解法,展示思考过程。
浙公网安备 33010602011771号