方法1 使用了hash
方法思路
使用哈希集合:首先將數組中的所有數字存入一個哈希集合中,這樣可以在 O(1) 時間內檢查某個數字是否存在。
尋找連續序列:遍歷數組中的每一個數字,對于每一個數字,
檢查它是否是某個連續序列的起點(即檢查 num - 1 是否存在于集合中)。
如果不是起點,則跳過;
如果是起點,則開始向后檢查連續的數字(num + 1, num + 2 等),并記錄序列的長度。
更新最大長度:在遍歷過程中,不斷更新記錄的最大序列長度。
這種方法確保每個數字最多被訪問兩次(一次在遍歷數組時,一次在檢查連續序列時),因此時間復雜度為 O(n)。
public int longestConsecutive(int[] nums) {/* 方法思路使用哈希集合:首先將數組中的所有數字存入一個哈希集合中,這樣可以在 O(1) 時間內檢查某個數字是否存在。尋找連續序列:遍歷數組中的每一個數字,對于每一個數字,檢查它是否是某個連續序列的起點(即檢查 num - 1 是否存在于集合中)。如果不是起點,則跳過;如果是起點,則開始向后檢查連續的數字(num + 1, num + 2 等),并記錄序列的長度。更新最大長度:在遍歷過程中,不斷更新記錄的最大序列長度。這種方法確保每個數字最多被訪問兩次(一次在遍歷數組時,一次在檢查連續序列時),因此時間復雜度為 O(n)。*/// 1.哈希集合初始化:將數組中的所有數字存入哈希集合 numSet 中,以便快速查找。Set<Integer> hashSet = new HashSet<>;for(int num:nums){hashSet.add(num);}int longesetStreak = 0;
// 2.遍歷集合:對于集合中的每一個數字,檢查它是否是某個連續序列的起點(即 num - 1 不在集合中)。for(int num:hashSet){// 3.擴展序列:如果是起點,則向后擴展序列,計算當前連續序列的長度 currentStreak。if(!hashSet.contains(num-1)){int currentNum =num;int currentStreak=1;while(hashSet.contains(currentNum+1)){currentNum++;currentStreak++;}// 4.更新最大值:比較并更新最長序列長度 longestStreak。longesetStreak=Math.max(longesetStreak,currentStreak);}}// 5.返回結果:最終返回最長序列的長度。return longesetStreak;}
方法二 排序法(時間復雜度大)
public int longestConsecutive(int[] nums) {// 處理邊界情況:空數組直接返回0if (nums.length == 0) return 0;// 對數組排序(升序),便于后續連續元素判斷Arrays.sort(nums);int maxLength = 0; // 記錄最長連續子序列長度int currentLength = 1; // 當前連續子序列長度,初始為1(至少有一個元素)// 從第二個元素開始遍歷(索引1到末尾)for (int i = 1; i < nums.length; i++) {int currentNum = nums[i];int prevNum = nums[i - 1];if (currentNum == prevNum) {// 跳過重復元素(排序后相鄰重復,不影響連續性判斷)continue;} else if (currentNum == prevNum + 1) {// 當前元素與前一個元素連續,長度加1currentLength++;} else {// 連續序列中斷,更新最長長度,并重置當前長度maxLength = Math.max(maxLength, currentLength);currentLength = 1;}}// 處理最后一次連續序列(遍歷結束后可能還有未比較的長度)return Math.max(maxLength, currentLength);
}