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.
O(n) 的复杂度。这道题肯定要遍历每个数,那么对每个数的操作时间就是 O(1),考虑用 hashmap。hashmap 的 find 函数复杂度在大多数时间为 O(1)。此处的 hashmap 用的是 STL 中的 unordered_map。
class Solution {
public:
int longestConsecutive(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
// 空间换时间
// Map 的 find 复杂度为 Log
// Hashmap 的 find 复杂度为 O(1)
if(num.size()==0) return 0;
unordered_map <int,int> indexMap; // hashmap
int length = 0;
int maxLength = 0;
for(int i=0;i<num.size();i++)
{
indexMap[num[i]] = i;
}
vector<bool> visited(num.size(),false);
for(int i=0;i<num.size();i++)
{
if(visited[i]==true)
{
continue;
}
visited[i] = 1;
int index = num[i]+1;
length = 1;
while(indexMap.find(index)!=indexMap.end()) // 复杂度 O(1)
{
visited[indexMap[index]] = true;
length++;
index++;
}
index = num[i]-1;
while(indexMap.find(index)!=indexMap.end())
{
visited[indexMap[index]] = true;
length++;
index--;
}
maxLength = max(maxLength,length);
}
return maxLength;
}
};