題目
給定一個未排序的整數數組,找出最長連續序列的長度。
要求算法的時間複雜度爲 O(n)。
思路
一次遍歷無法找到整個連續序列最長的子序列。如果使用暴力解法需要O(n^2),不滿足題目要求。
因此考慮使用哈希表解決問題。
1.遍歷一次數組,將數組中所有數據入哈希表;
2.找到序列最長的子序列:因爲要求時間複雜度最小,因此需要避免一個子序列中的多個元素被重複判斷多次。
解決這個問題的方法是:每次判斷前,確定當前數據num
沒有前驅,即不存在numSet.constains(num-1)
。
這樣可以保證每一個子序列中的元素只在內部循環中出現一次。
代碼
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> numSet = new HashSet<>();
for(int i:nums){
numSet.add(i);
}
int longestLen=0;
for(int i:numSet){
if(!numSet.contains(i-1)){
int curNum=i;
int curLen=1;
while(numSet.contains(curNum+1)){
curNum+=1;
curLen+=1;
}
longestLen=Math.max(longestLen,curLen);
}
}
return longestLen;
}
}
複雜度分析
- 時間複雜度:O(n)
- 空間複雜度:O(n)