Description
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.
my program
思路:如果允许
O(nlogn)
的复杂度,那么可以先排序,可是本题要求O(n)
。
由于序列里的元素是无序的,又要求O(n)
,首先要想到用哈希表。
方法一
先排序,然后遍历找出最长递归序列;时间复杂度为
O(nlogn)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()) return 0;
sort(nums.begin(), nums.end());
int max = 1;
int count = 1;
for(int i = 1; i<nums.size(); i++)
{
if(nums[i] == nums[i-1])
continue;
if((nums[i]-1) == nums[i-1])
count++;
else
count = 1;
if(max < count)
max = count;
}
return max;
}
};
Submission Details
68 / 68 test cases passed.
Status: Accepted
Runtime: 13 ms
方法二
用哈希表, 时间复杂度为
O(n)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()) return 0;
map<int,int> m1;
int max = 1;
int i = 0;
for(; i<nums.size(); i++)
{
m1[nums[i]] = i;
}
while(!m1.empty())
{
int count = 1;
i = m1.begin()->first;
while(m1.find(i+1) != m1.end())
{
m1.erase(i+1);
count++;
i++;
}
i = m1.begin()->first;
while(m1.find(i-1) != m1.end())
{
m1.erase(i-1);
count++;
i--;
}
m1.erase(m1.begin());
if(max < count)
max = count;
}
return max;
}
};
Submission Details
68 / 68 test cases passed.
Status: Accepted
Runtime: 9 ms