思路
常规的暴力解法是 对于数组中的每个元素x,都去检查数组中是否存在x+1,x+2···以及x-1,x-2···
那么假设数组中存在x+1,那么当我们检查x+1时,需要重复检查x+2···是否存在数组当中。而且,显然区间长度一定小于x为起点的区间。
即对于任意元素y,如果y-1存在于数组中,则跳过该元素。
只有y-1不存在于数组中的y才有可能是最长区间的起点。
所以我们可以用哈希表对这类元素进行跳过。
Python版本
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
d = set()
for num in nums:
d.add(num)
res = 0
for num in nums:
if num - 1 in d:
continue
else:
# 以num为起点的最长区间长度
length = 1
while True:
if num + 1 in d:
length+=1
num += 1
else:
break
if length > res:
res = length
return res
Java版本
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> numSet = new HashSet<Integer>();
for (int num : nums){
numSet.add(num);
}
int res = 0;
for (int num:nums){
if (numSet.contains(num-1)){
continue;
}
else{
int len = 1;
while (true){
if(numSet.contains(num+1)){
len++;
num++;
}
else{
break;
}
}
if (len > res){
res = len;
}
}
}
return res;
}
}