class Solution { public: int longestConsecutive(vector<int>& nums) { int ans = 0; unordered_set<int> st(nums.begin(), nums.end()); // 把 nums 转成哈希集合 for (int x : st) { // 遍历哈希集合 if (st.contains(x - 1)) { continue; } // x 是序列的起点 int y = x + 1; while (st.contains(y)) { // 不断查找下一个数是否在哈希集合中 y++; } // 循环结束后,y-1 是最后一个在哈希集合中的数 ans = max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数 } return ans; } }; 作者:灵茶山艾府 链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/3005726/ha-xi-biao-on-zuo-fa-pythonjavacgojsrust-whop/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间: 2025-04-03 08:13:12 浏览: 27
这个代码是一个用于求解最长连续序列长度的问题解决方案。具体来说,给定一个未排序的整数数组 `nums`,目标是从中找出最长的连续元素序列,并返回该序列的长度。
### 解决思路分析
#### 使用unordered_set存储数据
首先将输入数组转化为无序集合(unordered_set),利用集合的特点快速检查某个数字是否存在。这样做的好处是可以降低时间复杂度到 O(1) 级别。
```cpp
unordered_set<int> st(nums.begin(), nums.end());
```
这里把所有的数值都存入了哈希表(st)当中。
#### 主循环处理每个元素
遍历哈希集合并寻找所有潜在的"起始点"(即当前值x前一位不存在于set中的情况):
如果发现某数x-1不在集合里,则说明x可能是某个连续序列的第一个成员;反之则跳过它因为它的位置肯定不是开头部分。
```cpp
if (st.contains(x - 1)) {
continue; // 这个数不可能作为开始的一位所以直接略过
}
```
确定了候选起点之后就尝试构建尽可能长的新序列:
```cpp
int y = x + 1;
while (st.contains(y)) {
y++; // 只要y还在hash set里面 就一直递增直到找不到为止
}
ans = max(ans, y - x);
```
在这个过程中我们持续增加y直至无法匹配更多相连项然后更新最终结果变量ans表示目前找到的最大跨度距离。
最后当整个过程完成后就可以得到全局最优解也就是最大的那个差值数目啦!
### 时间&空间效率考量
此算法整体运行时间为O(n),其中n代表原始列表大小因为我们只扫描了一遍而且每次判断操作平均耗时也是常量级别的。同时由于创建了一个额外的数据结构来辅助查询故需占用线性的附加内存空间。
阅读全文
相关推荐


















