###### tags: `LeetCode` `Medium`
# LeetCode #128 [Longest Consecutive Sequence](https://leetcode.com/problems/longest-consecutive-sequence/)
### (Medium)
給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。
請你設計並實現時間複雜度為 O(n) 的算法解決此問題。
---
若不考慮時間複雜度, 則直接排序nums, 然後遍歷, 若nums[i]連續則計數器+1, 直到斷檔, 更新最大連續數量。便利完成後即可得到答案。
時間複雜度為O(nlogn)(排序時間)
```
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()){
sort(nums.begin(),nums.end());
int maxv=0;
int tmp=1;
for(int i=1;i<nums.size();i++){
if(nums[i]==nums[i-1]+1)tmp++;
else if(nums[i]==nums[i-1]){
}
else{
maxv=max(maxv,tmp);
tmp=1;
}
}
return max(maxv,tmp);
}
return 0;
}
};
```
---
O(n)的作法(1):
創建一Hash表(unordered_map), 將nums[i]依次放入並檢查左右是否存在, 若左右存在則代表nums[i]成為橋梁, 該連續長度變為左長度+右長度+1, 若左邊或右邊只存在一邊, 則包含nums[i]的連續長度變為左(或右)長度+1, 並且隨時更新最大值, 遍歷完整個nums即可得到答案。
```
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()){
unordered_map<int,int> check;
int ans=INT_MIN;
for(int n:nums){
if(check.count(n))continue;
auto lit=check.find(n-1);
auto rit=check.find(n+1);
int l=(lit==check.end())?0:lit->second;
int r=(rit==check.end())?0:rit->second;
check[n]=l+r+1;
check[n+r]=l+r+1;
check[n-l]=l+r+1;
ans=max(ans, l+r+1);
}
return ans;
}
return 0;
}
};
```
---
直接把nums塞進Hash表裡並尋找若nums[i+1]存在則計數器+1直到斷檔, 要注意的是時間複雜度因為找過的數在下一次尋找時會直接被跳過, 所以整體來說時間複雜度仍然是O(n)。
```
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()){
unordered_set<int> check(nums.begin(),nums.end());
int ans=INT_MIN;
for(int n:check){
if(!check.count(n-1)){
int cnt=0;
while(check.count(n++))cnt++;
ans=max(ans,cnt);
}
}
return ans;
}
return 0;
}
};
```