这道题最容易想的就是排序后再遍历,但是时间复杂度就不是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)全球极客挚爱的技术成长平台