【力扣刷题第七天-3】 最长连续序列

本文介绍了一种O(n)时间复杂度解决最长连续序列问题的算法。通过建立哈希表存储数组元素,避免重复枚举,优化解题思路。核心是检查每个元素的前一个数是否存在,若不存在则从该元素开始寻找最长连续序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

提示:以下是本篇文章正文内容,编程语言为Java

一、题目描述

  给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

  请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

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

链接:最长连续序列

二、解题思路

  最朴素的想法是:我们考虑枚举数组中的每个数 x,考虑以其为起点,不断尝试匹配 x+1,x+2,⋯ 是否存在,假设最长匹配到了 x+n,那么以 x 为起点的最长连续序列即为 x,x+1,x+2,⋯,x+n,其长度为 n+1,我们不断枚举并更新答案即可。但这种方式显然不满足时间复杂度的要求。
  仔细分析这个过程,我们会发现其中执行了很多不必要的枚举,如果已知有一个x,x+1,x+2,⋯,x+n 的连续序列,而我们却重新从 x+1x+2 或者是 x+n 处开始尝试匹配,那么得到的结果肯定不会优于枚举 x 为起点的答案,因此我们在外层循环的时候碰到这种情况跳过即可。
  因此,我们可以用哈希表检查数组每一个元素 xx-1 是否存在,若存在直接跳过即可。若不存在,我们才去循环查找以 x 为起点的最长连续序列。

三、示例代码

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set=new HashSet<>();
        for(int num:nums){
            set.add(num);    
        }
        int ans=0;
        for(int num:set){
            int tmp=1;
            if(!set.contains(num-1)){
                while(set.contains(++num)){
                    ++tmp;
                }
            }
            ans=Math.max(ans,tmp);
        }
        return ans;
    }
}

总结

  当面对题目毫无思路时,我们可以采用最暴力的 枚举法 解决这个问题,然后,我们通过分析枚举的过程,来对枚举过程进行优化,去除一些重复或无用的枚举,也许就能成功解决难题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值