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.
拿到这道题目,第一反应就是没有思路TT。想了好久也只想到把全部元素排序,然后再去遍历一遍。但这样做的复杂度是O(nlgn),因为这是常用排序的最低复杂度。看了网上的几个解答感觉用散列表(哈希表)是一个很不错的想法,自己竟然忘记STL这么好用的东西,真是该死。
把数组元素全部放到一个map里去,数组元素作为key,value设为1,然后再检查每一个数组元素的左右相邻的数字是否在map中,以此得到最大的连续序列的长度。
代码实现如下:
class Solution {
public:
int longestConsecutive(vector<int> &num) {
map<int, int> m;
int result= 0;
for (int i = 0; i < num.size();i++){
m[num[i]] = 1;
}
for (int i = 0; i < num.size(); i++){
int tmp = 1;
if (m.count(num[i])){
m[num[i]] = 0;
int left = num[i] - 1;
while (m.count(left) && m[left] != 0){
m[left--] = 0;
tmp++;
}
int right = num[i] + 1;
while (m.count(right) && m[right] != 0){
m[right++] = 0;
tmp++;
}
}
result = result >= tmp ? result : tmp;
}
return result;
}
};