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
The longest consecutive elements sequence is
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的键值。代码如下:
但是这种方法运行时间更长。
leetcode上有O(n)实现的,但是看不懂 。。。。。
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)实现的,但是看不懂 。。。。。
相关文章推荐
- [leetcode]longest consecutive sequence(java)
- iOS Storyboard unwind segues使用小结
- NGUI之刚体无限弹跳
- guide
- HDU---Children's queue(递归解法)
- {A} + {B}(unique水)
- 多机的sequence问题与处理
- UIview需要知道的一些事情:setNeedsDisplay、setNeedsLayout
- xib自定义UIView报错误 "forUndefinedKey:]: this class is not key value coding-compliant for the key"
- UISementedControl、UIPageControl
- ROS学习手记 - 2 Build Package 生成包
- require.js 应用实例
- iPhone 应用程序开发 UIView和VIWindow
- Hive 接口介绍(Web UI/JDBC)
- 日志三:GUI事件处理
- unknown command-line argument or argument value build错误
- 《开源框架那点事儿20》:发布TinyUI前端框架
- Lucene Search(2)-filter,collector,querybuild
- NGUI 学习
- EasyUI Layout布局控件的缓存问题