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.
方法一:set实现
使用一个集合set存入所有的数字,然后遍历数组中的每个数字,如果其在集合中存在,那么将其移除,然后分别用两个变量pre和next算出其前一个数跟后一个数,然后在集合中循环查找,如果pre在集合中,那么将pre移除集合,然后pre再自减1,直至pre不在集合之中,对next采用同样的方法,那么next-pre-1就是当前数字的最长连续序列,更新res即可。
1 class Solution { 2 public: 3 int longestConsecutive(vector<int>& nums) { 4 if(nums.size()==0||nums.empty()) 5 return 0; 6 unordered_set<int> s(nums.begin(),nums.end()); 7 int res=0; 8 for(int val:nums) 9 { 10 if(!s.count(val)) 11 continue; 12 s.erase(val); 13 int pre=val-1,next=val+1; 14 while(s.count(pre)) 15 s.erase(pre--); 16 while(s.count(next)) 17 s.erase(next++); 18 res=max(res,next-pre-1); 19 } 20 return res; 21 } 22 };
方法二:map实现
刚开始哈希表为空,然后遍历所有数字,如果该数字不在哈希表中,那么我们分别看其左右两个数字是否在哈希表中,如果在,则返回其哈希表中映射值,若不在,则返回0,然后我们将left+right+1作为当前数字的映射,并更新res结果,然后更新d-left和d-right的映射值。
1 class Solution { 2 public: 3 int longestConsecutive(vector<int>& nums) { 4 if(nums.size()==0||nums.empty()) 5 return 0; 6 unordered_map<int,int> m; 7 int res=0; 8 for(int val:nums) 9 { 10 if(!m.count(val)) 11 { 12 int left=m.count(val-1)?m[val-1]:0; 13 int right=m.count(val+1)?m[val+1]:0; 14 int sum=left+right+1; 15 res=max(res,sum); 16 m[val]=sum; 17 m[val-left]=sum; 18 m[val+right]=sum; 19 } 20 } 21 return res; 22 } 23 };