每日题解:LeetCode 128. 最长连续序列
题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
解法
JAVA
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set=new HashSet<>();
for (int num : nums) {
set.add(num);
}
int res=0;
for (int num : set) {
if(!set.contains(num-1)){
int temp=0;
for (int tempNum =num; set.contains(tempNum); tempNum++) {
temp++;
}
res = Math.max(res, temp);
}
}
return res;
}
}
解题思路
这题目虽然是一个困难难度的题目,但是用上了set就比较简单了
假设X是最长连续序列的第一个数,我们只需要判断其 x+1, x+2,⋯ 是否存在,就可以了,判断是否存在使用set就可以了
Set<Integer> set=new HashSet<>();
for (int num : nums) {
set.add(num);
}
怎么确定当前数字就是序列的开始?
我们可以将当前数字-1,如果当前数字-1存在,那就表明当前数字在序列的中间
//左边的数不存在,表示当前数字是序列的开始
if(!set.contains(num-1)){
}
然后,寻找X+1,X+2
int temp=0;
for (int tempNum =num; set.contains(tempNum); tempNum++) {
temp++;
}
其实也可以用while,但是我觉得用for循环可以将赋值、比较、累加都能一行代码实现,就使用了for循环
寻找最大的序列
res = Math.max(res, temp);