写点什么

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

作者:HQ数字卡
  • 2022 年 6 月 09 日
  • 本文字数:871 字

    阅读完需:约 3 分钟

题目描述

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

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 4
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】最长连续序列Java题解_LeetCode_HQ数字卡_InfoQ写作社区