要求:
给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
思路:
先对数组进行去重吧,所以先把所有数据都传到一个HashSet中,而且利用HashSet的contains方法,时间复杂度是O(1);从前往后遍历整个数组,当前遍历到的数是num,就在HashSet中找num-1,如果找到了就再判断是否有num+1这个数,有就将数组长度加一,使用while不断循环判断。
因为如果一个数组中存在一个序列num,num+1,num+2,num+3和num-1,num,num+1,num+2,num+3,那么必然是取后一个序列。但是如果先对前面一个序列进行了判断,再对后一个序列进行判断,其实就是在做重复的工作了,所以每次遍历的时候,如果HashSet中不包含num-1,就说明num会是一个可能存在的连续序列的起始元素,满足这个条件才会进入第二个循环判断。
第二个判断就是看HashSet是否包含当前num+1这个元素,只要包含就把序列长度加一,同时当前元素也加一。
代码:
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> setNum = new HashSet<>();
for (int num : nums) {
setNum.add(num);
}
int longestAmount = 0;
for (int num : nums) {
if (!setNum.contains(num-1)) {
int currentNum = num;
int currentAmount = 1;
while (setNum.contains(currentNum+1)) {
currentAmount++;
currentNum++;
}
longestAmount = Math.max(longestAmount, currentAmount);
}
}
return longestAmount;
}
}