重温算法之最长连续序列

459 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一.题目介绍

1.题目来源

链接:LeetCode

2.题目

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

示例 1:

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

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9

二.具体实现

1.实现思路

题目明确要求了要实现时间复杂度为 O(n) 的算法,那可以先对数组进行排序,然后计算其是否是连续的,是连续就统计其次数,在连续中如果中间有重复值跳过,没有就继续统计,如果连续被打断要记录被打断的位置,最后返回长度。

2.实现代码

1)自己的实现方式

public int longestConsecutive(int[] nums) {
 int len = nums.length;
        if(len == 0) return 0;
        //排序
        Arrays.sort(nums);
        int res = 0;
        int count = 1;
        
        for(int i=1;i<len;i++){
        //是连续统计+1
            if(nums[i]-nums[i-1]==1) count++;
            //是重复则跳过
            else if(nums[i] == nums[i-1]) continue;
            //连续被打断,判断是原来记录连续长还是新连续长
            else{
                res = Math.max(res,count);
                count = 1;
            }
        }
        return Math.max(res,count);
}

2)题友的实现方式

动态规划:使用哈希表记录连续区间长度,遍历nums数组中的所有数字num,当num是第一次出现时: (1)分别获取到左相邻数字num-1的连续区间长度left和右相邻数字num+1的连续区间长度right; (2)计算得到当前的区间长度为curLen=left+right+1curLen=left+right+1; (3)更新最长区间长度ans以及左右边界的区间长度。 实现代码:

image.png

3.运行结果

image.png

image.png

三.题后思考

连续序列系列的题目也很多,我大概看了一下,解决方案里动态规划用得很多还有就是借助哈希表去实现,只能说题友们的思路真的很好,还有就是也应该尝试一下写出最优解。