【LeetCode】最长连续序列Java题解

275 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

题目描述

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是数组题目,题目要求找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度,并且要求时间复杂度为 O(n)的算法。
  • 首先想到可以对数组排序,但是不满足时间复杂度的要求,需要转化思路。
  • 暴力的方法就是枚举每一个数值的连续过程,我们需要处理每一个数据,在数组中寻找。数组中查找,我们常常使用 hashset, 判断数组是否包含某一个数。
  • 这里需要注意的一点是,单纯任意数字的查找,我们会有一部分重复计算。效率不高,这里,我们可以做一下处理,若当前的数字是最小的数字,在开始查找计算。这个优化的思路不好想,我是看题解才理解到的,需要多加理解一下。实现代码如下,供参考。 实现代码如下,供参考。

通过代码

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        for (int num : nums) {
            set.add(num);
        }

        int ans = 0;

        for (int num : set) {
            if (!set.contains(num - 1)) {
                int currentNum = num;
                int currentLength = 1;

                while (set.contains(currentNum + 1)) {
                    currentNum += 1;
                    currentLength += 1;
                }

                ans = Math.max(ans, currentLength);
            }
        }

        return ans;
    }
}

总结

  • 上述算法的时间复杂度是O(n),空间复杂度是O(n)
  • 坚持算法每日一题,加油!