最长连续序列
题目
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
样例
- 输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
Code1
分析
由于序列里的元素是无序的,又要求O(n),采用哈希表。
用一个哈希表记录每个元素是否使用,对每个元素,以该元素为中心,往左右扩张,知道不连续为止,并记录其连续的长度。
时间复杂度O(n),空间复杂度O(n)
int longestConsecutive(vector<int>& nums) {
unordered_map<int,bool> used;
for(auto i:nums) {
used[i]==false;
}
int longest=0;
for(auto i:nums) {
if(used[i]) {
continue;
}
int length=1;
used[i]=true;
for(int j=i+1; used.find(j)!=used.end(); j++) {
used[j]=true;
++length;
}
for(int j=i-1; used.find(j)!=used.end(); --j) {
used[j]=true;
++length;
}
longest=max(longest,length);
}
return longest;
}
Code2
分析
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_map<int, int> map;
int size=nums.size();
int l=1;
for(int i=0; i<size; i++){
if(map.find(nums[i]) != map.end()){
continue;
}
map[nums[i]]=1;
if(map.find(nums[i]-1) != map.end()){
l=max(l, mergeCluster(map, nums[i]-1, nums[i]));
}
if(map.find(nums[i]+1) != map.end()){
l=max(l, mergeCluster(map, nums[i], nums[i]+1));
}
}
return size == 0 ? 0 : 1;
}
private:
int mergeCluster(unordered_map<int, int> &map, int left, int right){
int upper=right + map[right] - 1;
int lower=left-map[left]+1;
int length=upper-lower+1;
map[upper]=length;
map[lower]=length;
return length;
}
};
若有疑问可评论交流=_=!