最长连续序列

继续给大家带来每日一题

题目描述:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

题目示例:
在这里插入图片描述

这道题目其实也不难,给大家分享的目的也只想分享一个思路,对于这种找连续的型的题目,起点是比较难确定的,如题目给的case:

nums = [100,4,200,1,3,2]

我们遍历到100的时候,我们要找下一个元素,但是下一个元素有可能是100+1,也有可能是100-1,这个时候就很难确定我们的走向是如何,现在我们有两种思路,但其本质都是确定从起点开始还是从终点开始

  • 1.对数组排序,这样我们从头到尾去遍历,只需要确定相邻元素的作差是否为1就可以判断是否是连续的,但是无论用什么排序算法其时间复杂度均会大于0(n)
  • 2.直接判断当前元素是否为起点
    • 100,前一个元素为99,数组无99,所以100是起点,100的下一个元素101,数组没有,所以以100为起点的连续数组长度是1
    • 4,前一个元素:3,数组有3,所以4不是起点,直接跳过
    • 200.前一个元素:199,数组无199,所以200是起点,200的下一个元素201,数组没有,所以以100为起点的连续数组长度是1
    • 1,前一个元素:0,数组无0,所以1是起点,1的下一个元素2,数组有,2的下一个元素3,数组有,3的下一个元素4,数组也有,4的下一个元素5,数组没有,所以以1为起点的连续数组长度是4
    • 3,前一个元素:2,数组有2,所以3不是起点,直接跳过
    • 2,前一个元素:1,数组有1,所以2不是起点,直接跳过

所以最大长度为4,知道了这个逻辑我们代码就很好实现了

    public static int longestConsecutive(int[] nums) {
        int max = 0;
        int n = nums.length;
        Set<Integer> set = new HashSet<>(n);
        for (int i : nums) {
            set.add(i);
        }
        for (int i : set) {
            if (!set.contains(i - 1)) {
                //说明是开头,依此去找符合+1的值
                int len = 1;
                int cuNum = i;
                while (set.contains(cuNum + 1)) {
                    len++;
                    cuNum++;
                }
                max = Math.max(len, max);
            }
        }
        return max;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZNineSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值