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; } };