Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
开始想的是sort后双指针, 但是sort是nlogn,所以放弃了。 只有用哈希表,我觉得这题目反人类了。。。看了答案想了会才明白。
用哈希表来维护一个当前数所在子集的长度。 当不存在的时候,检查n-1,n+1的长度, 那么为了连起来,总长度为left+right+1. ,同时更新左右边界。 只需要更新左右边界即可,因为新来的数只会从左右连接。。。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int res=0;
unordered_map<int, int> store;
for (int i=0; i<nums.size(); i++){
int n=nums[i];
if (store.find(n)!=store.end())
continue;
int left= store.find(n-1)==store.end()? 0: store[n-1];
int right=store.find(n+1)==store.end()? 0: store[n+1];
int len=left+right+1;
res=max(res,len);
store[n]=len;
store[n-left]=len;
store[n+right]=len;
}
return res;
}
};