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

LeetCode题解——Longest Consecutive Sequence

2016-01-18 19:46 501 查看
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.

Subscribe to see which companies asked this question
直观想法:排序:O(nlogn)
创新想法一:从头遍历array, 每遍历一个数i,确定其所在的序列的长度len。建立对应关系imap[i] = len. imap[i]代表数字i所在的序列长度
若i+1,i-1不存在,则iamp[i] = 0;
若i+1, i -1都存在,则imap[i] = imap[i-1] = imap[i+1]=
imap[i-1] + imap[i+1] +1;
若i+1存在,则iamp[i] = imap[i+1] = imap[i+1] +1;
若i-1存在,则imap[i] = imap[i-1] = imap[i-1]+1;
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int n = nums.size();
unordered_map<int,int> imap;
int longestConsecutive = 0;
for(auto i:nums){
if(imap[i]) continue;
longestConsecutive = max(longestConsecutive,imap[i] = imap[i-imap[i-1]] = imap[i+imap[i+1]] = imap[i+imap[i+1]] + imap[i-imap[i-1]] + 1);
}
return longestConsecutive;
}
};


创新想法二:
将原数组放到set里,去除重复数据,遍历set,每取一个数,将set里与之相邻的数都删掉,并计数。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> s(nums.begin(), nums.end());
int ans=0;

while (!s.empty()) {
int val = *s.begin(), k=val+1, len=1;
s.erase(val);

while (s.find(k)!=s.end())
++len, s.erase(k++);

k=val-1;
while (s.find(k)!=s.end())
++len, s.erase(k--);

ans=max(ans, len);
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: