LeetCode 128 – 最长连续序列

题目描述

给定一个未排序的整数数组 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

示例 3:
输入:nums = [1,0,1,2]
输出:3

题目分析

暴力求解

将所有元素放入HashSet,便于后续检查某个数字是否存在。
枚举每一个元素:假设当前数字n是序列的起点,写一个循环,检查n+1是否存在,以此类推,直到+1不存在,就得到了以数字n为起点的最长序列的长度。所有元素枚举完,就可以得到最大长度。
时间复杂度为 O(n^2)

条件优化

对于数字 n,如果 n-1 存在于数组中,那么 n 一定不是最长连续序列的起点。这样就可以对时间复杂度做优化,外层对起点的枚举依然会执行 n 次,但内层的 +1 循环判断全局只会执行 n 次。
总的执行次数是 2n,时间复杂度为 O(n)

Java

public int longestConsecutive(int[] nums) {
    HashSet<Integer> set = new HashSet<>();
    if (nums.length == 0) {
        return 0;
    }
    for (int num : nums) {
        set.add(num);
    }

    int ans = 0;

    for (int num : set) {
        if (set.contains(num - 1)) {
            continue;
        }
        int current = num;
        int len = 0;
        while (set.contains(current)) {
            len++;
            current++;
        }
        ans = Math.max(ans, len);
    }

    return ans;
}

Kotlin

fun longestConsecutive(nums: IntArray): Int {
    val set = HashSet<Int>()
    set.addAll(nums.toList())
    var ans = 0
    for (n in nums) {
        if (set.contains(n - 1)) {
            continue
        }
        var t = n
        var len = 0
        while (set.contains(t)) {
            t++
            len++
        }
        ans = max(ans, len)
    }
    return ans
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部