题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
用map存储给定数组中的数。c++中的map会依键值排序,所以遍历map中的数,对于此时遍历到的数num,如果num-1不在map中,则从num开始在map中找到最长的连续序列;如果num-1在map中,说明当前的num在之前的数查找最长连续序列时已经遍历过,则跳过num继续查找map中的下一个数的最长连续序列。时间复杂度为o(n+n)=o(n)。
代码(c++)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1) return 1;
int res=0;
map<int,int> mp;
for(int i=0;i<nums.size();i++){
if(mp.find(nums[i])==mp.end()) mp[nums[i]]=1;
}
for(map<int,int>::iterator it=mp.begin();it!=mp.end();it++){
if(mp.find(it->first-1)==mp.end()){
int curNum=it->first;
int len=1;
while(mp.find(curNum+1)!=mp.end()){
len+=1;
curNum+=1;
}
res=max(res,len);
}
}
return res;
}
};