您的位置:首页 > 产品设计 > UI/UE

Longest Consecutive Sequence

2015-07-05 22:30 330 查看
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.


解题思路:

求一个未排序数组中,出现的长度最长的连续子序列长度。


方法一:

利用sort和unique函数进行数组排序,并剔除重复元素。之后找最长连续的子序列长度即可。

class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
sort(nums.begin(),nums.end());
nums.erase( unique(nums.begin(), nums.end() ), nums.end() );
if(nums.size()<=1) return nums.size();
int longest=1;
int cur_len=1;
nums.push_back(-10000);
for(int i=0;i<nums.size()-1;i++)
{
if(nums[i]+1!=nums[i+1])
{
cur_len=1;
}
else
cur_len++;
if(longest<cur_len)
longest=cur_len;
}
return longest;

}
};

优点:方法简单,思路清晰。

缺点:排序时间复杂度为O(nlog),不满足题目 O(n)
的要求


方法二:

使用unordered_map。将nums的值作为unordered_map的键值。代码如下:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
unordered_map<int, bool>vv;//两个值,第一个存储nums的值,第二个存此值是否在nums中是连续数的组成的判断值。存在,true,不存在false
int cur_len=1;
int longest=0;
for(auto i:nums)//相当于迭代器应用,对vv初始化
vv[i]=false;
for(auto i:nums)//i值遍历nums的每个值,相当于穷搜索
{
if(vv[i])
continue;
cur_len = 1;
for (int j = i + 1; vv.find(j) != vv.end(); ++j)  //i就是nums的一个值,在find中找比i大一的值。向上找连续数
{
cur_len++;
vv[j]=true;
}
for (int m = i - 1; vv.find(m) != vv.end(); --m) //i就是nums的一个值,在find中找比i小一的值,向下找连续数
{
cur_len++;
vv[m] = true;
}
longest=max(longest,cur_len);
}
return longest;

}
};


但是这种方法运行时间更长。

leetcode上有O(n)实现的,但是看不懂 。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: