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.
虽然AC, 但仍未达标, O(n)
class Solution {
public:
int longestConsecutive(vector<int> &num)
{
int len = num.size();
if(len<=1)
return len;
sort(num.begin(),num.end());
int numb=1;
int tem;
for(int i=1;i<len;i++)
{
tem = 1;
while(i<len&&(num[i]==num[i-1]+1)||(num[i]==num[i-1]))//这里没有i<len老出错, 哎~
{
if(num[i]==num[i-1])
{
i++;
continue;
}
tem++;
i++;
}
if(tem>numb)
numb = tem;
}
return numb;
}
};
转载一个符合要求的算法hash
classSolution
{
public:
int longestConsecutive(std::vector<int> &num)
{
for(int i = 0; i < num.size(); ++i)
{
flags_.insert(num[i]);
}
int maxLen = 0;
for(int i = 0; i < num.size(); ++i)
{
int ascendingMax = FindConsecutiveNumbers(ASCENDING, num[i]);
int decendingMax = FindConsecutiveNumbers(DECENDING, num[i] - 1);
if(ascendingMax + decendingMax > maxLen)
{
maxLen = ascendingMax + decendingMax;
}
}
return maxLen;
}
private:
enum OrderBy
{
ASCENDING,
DECENDING
};
int FindConsecutiveNumbers(OrderBy orderBy, int value)
{
int maxLen = 0;
while(flags_.find(value) != flags_.end())
{
++maxLen;
flags_.erase(value);
if(orderBy == ASCENDING)
{
++value;
}
else
{
--value;
}
}
return maxLen;
}
std::unordered_set<int> flags_;
};
哈希表的实现