正文:
今日打卡宣言
Day 9,坚持第9天!连续9天没断,感觉已经有点坚持的惯性了。今天刷了这道经典的最长连续序列,两种方法都手写了一遍,收获很大。继续冲!
LeetCode 部分
- 题目链接:leetcode.cn/problems/lo…
- 难度:中等
- 时间复杂度目标:O(n) (哈希Set解法)
核心思路: 这题的关键在于去重 + 找连续序列起点。
- 方法一(推荐,O(n)):用 unordered_set 去重,然后只从“序列起点”(即 num-1 不存在于集合中)开始向后查找连续数字。
- 方法二:先排序 + unique 去重,再一次遍历统计连续长度。
代码 - 方法一(哈希Set O(n)) :
C++
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.empty()) return 0;
unordered_set<int> st(nums.begin(), nums.end());
int maxLen = 1;
for (int num : st) {
// 只有当 num-1 不存在时,才是连续序列的起点
if (st.count(num - 1) == 0) {
int curNum = num;
int curLen = 1;
while (st.count(curNum + 1)) {
curNum++;
curLen++;
}
maxLen = max(maxLen, curLen);
}
}
return maxLen;
}
};
代码 - 方法二(排序 + unique 去重) :
C++
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.empty()) return 0;
sort(nums.begin(), nums.end());
// unique + erase 高效去重(排序后才能用)
nums.erase(unique(nums.begin(), nums.end()), nums.end());
int maxLen = 1;
int curLen = 1;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == nums[i-1] + 1) {
curLen++;
} else {
maxLen = max(maxLen, curLen);
curLen = 1;
}
}
return max(maxLen, curLen);
}
};
易错点 & 面试追问:
- 必须先去重,否则重复数字会干扰连续判断。
- 哈希Set方法一定要判断 num-1 不存在,才开始计数(避免重复计算)。
- 排序方法里 unique + erase 是 C++ 去重的经典写法。
- 面试常问:如果不用额外空间怎么做?(排序方法空间 O(1),但时间 O(n log n))
知识点部分
哈希Set + 起点判断技巧
- 这题最巧妙的地方是只从序列起点开始扩展,避免了重复遍历。
- unordered_set 在这题中既做了去重,又提供了 O(1) 查询。
- 排序 + unique 是处理“去重后连续统计”的常用组合,记住这个套路。
今日感悟
今天把最长连续序列的两种解法都手写了一遍,深刻体会到“去重”在这题里的重要性。哈希Set的 O(n) 解法写出来后感觉特别优雅 然后学到一个c++对vector高效去重的方法, 使用unique去重
结束语
明天见! 欢迎评论区交流:
- 你更喜欢哪种写法?哈希Set还是排序?
- 代码哪里还能优化?
- 你面试中遇到过这题吗?
#程序员打卡 #LeetCode #最长连续序列 #哈希Set #滑动窗口 #Go语言 #C++