【LeetCode 面试经典150题】128. Longest Consecutive Sequence 最长连续序列

128. Longest Consecutive Sequence

题目大意

Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence.

You must write an algorithm that runs in O(n) time.

中文释义

给定一个未排序的整数数组 nums,返回最长连续元素序列的长度。

你必须编写一个在 O(n) 时间内运行的算法。

示例

Example 1:

Input: nums = [100,4,200,1,3,2]
Output: 4
Explanation: 最长连续元素序列是 [1, 2, 3, 4]。因此它的长度是 4。

Example 2:

Input: nums = [0,3,7,2,5,8,4,6,0,1]
Output: 9

限制条件

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

解题思路

方法

即在一个未排序的整数数组中找出最长的连续元素序列的长度。为了达到 O(n) 的时间复杂度,使用了哈希集合(unordered_set)来存储数组中的所有元素,这使得查找特定元素的操作变得非常快速。

  1. 创建哈希集合

    • 使用 unordered_set<int> 将数组 nums 中的所有元素添加到集合中。这样可以在 O(1) 时间复杂度内判断一个元素是否存在于集合中。
  2. 遍历数组

    • 遍历数组 nums 中的每个元素 num
      • 首先检查 num - 1 是否存在于集合中,以确定 num 是否是一个连续序列的起始点。
      • 如果 num 是起始点,则从 num 开始向后查找连续的数字,直到找不到下一个连续的数字。
  3. 查找并更新最长序列

    • 对于每个起始点,计算从该点开始的连续序列的长度,并更新最长序列的长度。
  4. 返回结果

    • 最终返回计算得到的最长连续序列的长度。

代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> num_set(nums.begin(), nums.end());
        int longestStreak = 0;

        for (int num : nums) {
            if (!num_set.count(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;
                while (num_set.count(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak += 1;
                }
                longestStreak = max(longestStreak, currentStreak);
            }
        }
        return longestStreak;
    }
};
  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值