题目链接:leetcode 128
1.题目
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
2.示例
1)示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
2)示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
3)提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109文章来源:https://uudwc.com/A/3w1rb
3.分析
可以使用三个map分别对应num是否存在nums数组中、num所在的数组的左端点,num所在的数组的右端点,只要num1-1在nums数组中,就不断移动nums,同理去找到数组的右端点,然后更新[num1,num2]中间的所有数对应的左右端点,可以知道每个节点最多访问一遍文章来源地址https://uudwc.com/A/3w1rb
4.代码
class Solution {
public:
map<int,int> map1,map2,map3;
int longestConsecutive(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
map1[nums[i]]=1;
for(int i=0;i<nums.size();i++){
if(map2.count(nums[i])==0)
{
int num1=nums[i];
while(map1.count(num1)!=0) num1--;
int num2=nums[i];
while(map1.count(num2)!=0) num2++;
for(int j=num1+1;j<num2;j++) {
map2[j]=num1+1;
map3[j]=num2-1;
}
}
}
int ans=0;
for(int i=0;i<nums.size();i++)
ans=max(ans,map3[nums[i]]-map2[nums[i]]+1);
return ans;
}
};