LeetCode 最长连续序列(哈希表/并查集)

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence

思路:

难点主要就是时间复杂度要求O(n)

正常思路是排序:

从小到大排序
遍历数组,比较相邻的两项,如果相同,则跳过,继续遍历下一项
如果 当前项+1 等于 下一项,说明遇到连续项,count +1
否则,说明连续中断,将 count 重置为 1
但是时间复杂度O(nlogn)不符合要求

哈希表

使用额外的空间O(n)哈希表存储数字,查询的时候就会变成O(1)
Set 查找元素的时间复杂度是 O(1),JS 的 Set 能给数组去掉重复元素
将数组元素存入 set 中,遍历数组 nums
如果 nums[i] - 1 存在于 set ,说明 nums[i] 不是连续序列的起点,跳过,继续遍历
当前项没有“左邻居”,它就是连续序列的起点
不断在 set 中查看 cur + 1 是否存在,存在,则 count +1
cur 不再有 “右邻居” 了,就算出了一段连续序列的长度

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> num_set;
        for(int num:nums){
            num_set.insert(num);
        }
        int max_len = 0;
        for(int num:num_set){
            if(!num_set.count(num-1)){
                int cur_num = num;
                int cur_len = 1;
                while(num_set.count(cur_num+1)){
                    cur_num++;
                    cur_len++;
                }
                if(cur_len>max_len) max_len =cur_len;
            }
        }
        return max_len;
    }
};

并查集(暂时不会)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值