最长连续序列

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是[1, 2, 3, 4]。它的长度为 4。

 思路:

  1. 使用unordered_map<int, int> record,nums中的数作为键,键在当前record内的连续数为其值
  2. 遍历nums,如果record中存在nums[i],则跳过,即去掉重复的值
  3. 如果nums[i]-1在record中存在,则获取nums[i]-1在record及之前的连续的个数left,record[nums[i]-1]即可,否则为0
  4. 如果nums[i]+1在record中存在,则获取nums[i]+1在record及之前的连续的个数right,record[nums[i]+1]即可,否则为0
  5. nums[i]的连续数即为左边的连续数加上右边的连续数,再加1
  6. 更新这串连续数的最左端与最右端的连续数数,与nums[i]的连续数相同,record[nums[i]-left],record[nums[i]+right]
  7. 将最大的连续数保存起来
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;
    }
};

猜你喜欢

转载自blog.csdn.net/leaf_scar/article/details/88422869