给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是[1, 2, 3, 4]。它的长度为 4。
思路:
- 使用unordered_map<int, int> record,nums中的数作为键,键在当前record内的连续数为其值
- 遍历nums,如果record中存在nums[i],则跳过,即去掉重复的值
- 如果nums[i]-1在record中存在,则获取nums[i]-1在record及之前的连续的个数left,record[nums[i]-1]即可,否则为0
- 如果nums[i]+1在record中存在,则获取nums[i]+1在record及之前的连续的个数right,record[nums[i]+1]即可,否则为0
- nums[i]的连续数即为左边的连续数加上右边的连续数,再加1
- 更新这串连续数的最左端与最右端的连续数数,与nums[i]的连续数相同,record[nums[i]-left],record[nums[i]+right]
- 将最大的连续数保存起来
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty())
return 0;
unordered_map<int, int> record;
int max_count = 0;
for(int i=0; i<nums.size(); i++)
{
if(record.find(nums[i]) != record.end())
continue;
int left = 0;
int right = 0;
if(record.find(nums[i]-1) != record.end())
left = record[nums[i]-1];
if(record.find(nums[i]+1) != record.end())
right = record[nums[i]+1];
int count = 1+left+right;
record[nums[i]] = count;
if(left != 0)
record[nums[i]-left] = count;
if(right != 0)
record[nums[i]+right] = count;
if(max_count < count)
max_count = count;
}
return max_count;
}
};