leetcode hot100 之 最长连续序列

题目

给定一个未排序的非负整型数组,找出数字连续的最长序列的长度。要求时间复杂度 O(n)

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

原题链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/

思路

思路1

哈希法
首先暴力法就是,外循环遍历每一个数,设这个数为 x,然后进一步查找数组当中有没有 x + 1、 x + 2,但这样每一次查找都是 O(n),有没有办法把查找降为 O(1) ?答案是肯定的,我们维护一个哈希表即可。
即先把所有数放入哈希表中,外循环遍历每一个数 x,然后到哈希表当中找是否有 x + 1,有的话再进一步找 x + 2。知道 找不到 x + n 为止,此时 n 就是最大长度了。
另外外循环可能存在重复的情况,如第一次遇到 a,我们会到哈希表中找 a+1、a+2、a+3…;第二次遇到 a+1 时,我们会到哈希表中找 a+2、a+3…;实际上,第二次这个查找是多余的,即从非序列首个数字开始的遍历都是多余的。我们可以通过判断 x - 1 是否在哈希表来判断 x 是否是序列首个数字,由此跳过一次查找。
这样也就使得我们的复杂度降为 O(n)。

  • 复杂度分析
    • 时间复杂度 O(n)。
    • 空间复杂度 O(n)。哈希表
思路2

排序法
另一种就是对数组先进行一次排序,然后再采用双指针法记录窗口大小即可。但是时间复杂度比 思路1 大一些,空间复杂度可以省一点。由于时间复杂度不满足题目要求,这里先不展开写code了。

  • 复杂度分析
    • 时间复杂度 O(nlogn)。
    • 空间复杂度 O(1)。

代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> num_set;
        for (int num: nums) {
            num_set.insert(num);
        }
        int max_length = 0;
        for (int num: nums) {
            if (num_set.count(num - 1) == 0) {
                int cur_length = 1;
                int next_num = num + 1;
                while(num_set.count(next_num)) {
                    cur_length++;
                    next_num++;
                }
                max_length = max(max_length, cur_length);
            }
        }
        return max_length;
    }
};
### LeetCode Hot 100 Problems 列表 LeetCode 的热门题目列表通常由社区投票选出,涵盖了各种难度级别的经典编程挑战。这些题目对于准备技术面试非常有帮助。以下是部分 LeetCode 热门 100 题目列表: #### 数组与字符串 1. **两数之和 (Two Sum)** 2. **三数之和 (3Sum)** 3. **无重复字符的最长子串 (Longest Substring Without Repeating Characters)** 4. **寻找两个正序数组的中位数 (Median of Two Sorted Arrays)** #### 动态规划 5. **爬楼梯 (Climbing Stairs)** 6. **不同的二叉搜索树 (Unique Binary Search Trees)** 7. **最大子序列和 (Maximum Subarray)** #### 字符串处理 8. **有效的括号 (Valid Parentheses)** 9. **最小覆盖子串 (Minimum Window Substring)** 10. **字母异位词分组 (Group Anagrams)** #### 图论 11. **岛屿数量 (Number of Islands)** 12. **课程表 II (Course Schedule II)** #### 排序与查找 13. **最接近原点的 K 个点 (K Closest Points to Origin)** 14. **接雨水 (Trapping Rain Water)** 15. **最长连续序列 (Longest Consecutive Sequence)[^2]** #### 堆栈与队列 16. **每日温度 (Daily Temperatures)** 17. **滑动窗口最大值 (Sliding Window Maximum)** #### 树结构 18. **验证二叉搜索树 (Validate Binary Search Tree)** 19. **二叉树的最大路径和 (Binary Tree Maximum Path Sum)** 20. **从前序与中序遍历序列构造二叉树 (Construct Binary Tree from Preorder and Inorder Traversal)** #### 并查集 21. **冗余连接 II (Redundant Connection II)** #### 贪心算法 22. **跳跃游戏 (Jump Game)** 23. **分割等和子集 (Partition Equal Subset Sum)** #### 双指针技巧 24. **环形链表 II (Linked List Cycle II)[^1]** 25. **相交链表 (Intersection of Two Linked Lists)** #### 其他重要题目 26. **LRU缓存机制 (LRU Cache)** 27. **打家劫舍系列 (House Robber I & II)** 28. **编辑距离 (Edit Distance)** 29. **单词拆分 (Word Break)** 此列表并非官方发布版本而是基于社区反馈整理而成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值