这道题最容易想的就是排序后再遍历,但是时间复杂度就不是O(n)了,所以还是得用更优的解法,直接看题解,它是使用了HashSet,遍历数组,对于每一个数x,如果不存在x - 1则进入内循环,否则跳过,内循环里就是依次查看x+1、x+2、x+3、......是否存在,并维护一个变量currentStreak来记录连续数字的长度,维护一个longestStreak变量来记录出现最长的连续数字的长度,文字描述了一遍,试着以这种思路编码,代码如下
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> hashSet = new HashSet<>();
// 把数组元素存到Set集合中,便于查找
for (int num : nums) {
hashSet.add(num);
}
// 维护一个记录连续数字长度最长的变量
int longestStreak = 0;
// 遍历Set集合元素
for (int num : hashSet) {
// 对于num如果集合中不存在num - 1,那么就说明这个数字
// 可以作为最长连续数字的开头,否则就不行
if (!hashSet.contains(num - 1)) {
// 记录当前的元素
int currentNum = num;
// 记录连续数字出现的次数
int currentStreak = 1;
// 查询是否存在连续数字序列,并记录其长度
while (hashSet.contains(currentNum + 1)) {
currentNum += 1;
currentStreak++;
}
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
}
题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台