持续创作,加速成长!这是我参与「掘金日新计划 · 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)
- 坚持算法每日一题,加油!