LC.128 最长连续序列

文章介绍了两种方法来找到数组中的最长连续序列。方法一是通过对数组排序,然后检查相邻元素是否连续;方法二是利用哈希表去重并遍历,寻找连续序列。两种方法都涉及到对数组元素的连续性和重复性的处理。
摘要由CSDN通过智能技术生成

题目链接

1 前言

翻译成大白话:例如nums = [100,4,200,3,1,2]; 其最长连续序列为4, 也就是[1,2,3,4];

2 算法步骤

方法一

【第一步】由于数组是无序的,我们可以对其进行排序。

【第二步】由于排序后,nums 变为[1,2,3,4,100,200]。如何寻找最长的连续序列呢?

其实就是nums[i-1] + 1 ==nums[i]。

【第三步】细节处理,可能会存在[1,2,2,3,4,100,200]重复的数字。因此可以使用利用continue。

如果nums[i-1]==nums[i]则continue。

具体代码

public int longestConsecutive2(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        Arrays.sort(nums);
        int max = 1;
        int res = 1;
        for (int i = 1; i < n; i++) {
            if (nums[i] == nums[i-1]) {
                continue;
            }
            if (nums[i] == nums[i-1] +1){
                max++;
                res = Math.max(res,max);
            } else {
                max = 1;
            }
        }
        return res;

方法二

借助set进行去重。

【第一步】借助set进行去重,但是set里面数字是无序的。

【第二步】遍历数组。核心代码如下

// 遍历去重和后的set
        for (int num : set) {
            int cur = num;
            // 只有当num -1 不存在,才开始向后遍历。
            if (!set.contains(cur - 1)) {
                while (set.contains(cur + 1)) {
                    cur++;
                }
            }
            // [num,cur]之间是连续的。记录长度
            ans = Math.max(ans, cur - num + 1);
        }
        return ans;

具体代码

public int longestConsecutive(int[] nums) {
        // 建立一个存储所有数的哈希表,同时起到去重功能
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        int ans = 0;
        // 遍历去重和后的set
        for (int num : set) {
            int cur = num;
            // 只有当num -1 不存在,才开始向后遍历。
            if (!set.contains(cur - 1)) {
                while (set.contains(cur + 1)) {
                    cur++;
                }
            }
            // [num,cur]之间是连续的。
            ans = Math.max(ans, cur - num + 1);
        }
        return ans;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

兜兜转转m

一毛钱助力博主实现愿望

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

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

打赏作者

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

抵扣说明:

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

余额充值