LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

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 };
原文地址:https://www.cnblogs.com/xidian2014/p/8652148.html