【Day 9】公开打卡第9天 | LeetCode 128. 最长连续序列(哈希Set O(n) + 排序去重)

4 阅读2分钟

正文

今日打卡宣言

Day 9,坚持第9天!连续9天没断,感觉已经有点坚持的惯性了。今天刷了这道经典的最长连续序列,两种方法都手写了一遍,收获很大。继续冲!

LeetCode 部分

核心思路: 这题的关键在于去重 + 找连续序列起点

  • 方法一(推荐,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++