# 128. Longest Consecutive Sequence [leetcode網址](https://leetcode.com/problems/longest-consecutive-sequence/description/) ## 問題 給你一個一維整數陣列`nums`,找到最長有連續整數的序列長度 ``` Input: nums = [100,4,200,1,3,2] Output: 4 The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4. ``` ## Time = O (n) || Space = O(n) ### Idea 每次都去看左邊和右邊的連續數字的長度,兩邊長度再加自己,然後一直更新最長長度`length` 1. 檢查是否已經拜訪過 2. 檢查左邊是否有連續數字 ? 往左連續走的長度 : 0 3. 檢查右邊是否有連續數字 ? 往右連續走的長度 : 0 4. 現在長度更新 = 往左連續走的長度 + 往右連續走的長度 + 1(自己) 5. 更新往左走到底的長度,更新往右走到底的長度 -> 可能成為其他人的左邊或右邊連續數字 6. 更新最大長度 = max(length, current) ### Solution ```cpp int longestConsecutive(vector<int>& nums) { int length=0; unordered_map<int, int>map; for(auto&num: nums){ if(map.count(num))continue; int left = map.count(num-1) ? map[num-1] : 0; int right = map.count(num+1) ? map[num+1] : 0; int current = left + right + 1; map[num] = current; map[num-left] = current; map[num+right] = current; length = max(current, length); } return length; } ``` ## Solution 2. 2025/12/19 太慢了,還用很多空間 ```c class Solution { public: int longestConsecutive(vector<int>& nums) { priority_queue<int, vector<int>, less<int>>pq; unordered_set<int>numSet; for(auto num:nums){ if(numSet.count(num))continue; numSet.insert(num); pq.push(num); } int maxLen=0; if(!pq.empty()){ int len=1; maxLen=1; int prev=pq.top(); pq.pop(); while(!pq.empty()){ int cur = pq.top(); pq.pop(); if(prev-cur == 1){ len++; }else{ len=1; } prev = cur; maxLen = max(maxLen, len); } } return maxLen; } }; ```