1 题目
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.
题目链接:
找出无序数列中的连续子序列的个数
2 分析
这个题目要求复杂度为O(N),所以不能对其进行排序(因为排序至少需要O(NlogN))
看到过别人总结的经验:
遇到不能排序又要复杂度O(n)有序的问题,只能增加空间复杂度,用hashset或者hashtable
在
unordered_set
内部,元素不会按任何顺序排序,而是通过元素值的 hash 值将元素分组放置到各个槽(Bucket)中,这样就能通过元素值快速地访问各个对应的元素(平均耗时为一个常量,即时间复杂度为 O(1))
方法:
将给定的序列存到一个无序set中备用,遍历一遍数组:对每个数字,在set中分两个方向(数字增大方向、数字减小方向)查找其连续的数,如果查到,则将该数从set中删去,并记录下长度。
3 C++代码
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int n = nums.size();
set<int> hash;
if(nums.empty())
return 0;
int maxLen = 0;
for(auto x : nums) {
hash.insert(x);
}
for(auto x : nums) {
int len = 1;
int incNum = x + 1;
int decNum = x - 1;
//向上寻找,在set中count的返回值不是1就是0
while(hash.count(incNum)) {
hash.erase(incNum);
len++;
incNum++;
}
//向下寻找
while(hash.count(decNum)) {
hash.erase(decNum);
len++;
decNum--;
}
maxLen = max(maxLen, len);
}
return maxLen;
}
};