2020-06-06 LeetCode 128 最长连续数列 C++

题目:128. 最长连续序列

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

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

示例:

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

 时间复杂度为O(n),排序算法排除,第一时间想到的就是HashMap,c++里边的map就是有序表,把所有元素都插进去之后自然是有序的,然后在再遍历有序表看最长连续是多少就比较简单了,时间上需要遍历一次数组和Map,复杂度为O(n),空间复杂度易得为O(n)

代码如下:

class Solution {
public:
    int longestConsecutive(vector& nums) {
        if(nums.empty())
            return 0;
        map order;
        map::iterator iter;
        int last=nums[0],ans=0,cnt=0;
        //插入元素,有序表默认从小到大
        for(int i=0;ifirst;
            //前面有连续序列
            if(num==last+1){
                cnt++;
                last++;
            }
            //无连续序列
            else {
                last=num;
                cnt=1;   
            }
            ans=max(cnt,ans);
        }
        return ans;
    }
};

运行结果:

2020-06-06 LeetCode 128 最长连续数列 C++_第1张图片

 官方的题解我也想到过,但是没有仔细推算过时间复杂度,本质上是用map的快速查询,实现感觉也不是很出彩,倒是在别的题解看到一个贼简洁的的,也是并查集:https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/cbing-cha-ji-xie-fa-dai-ma-ji-duan-by-leck/
思路是:

  • 初始化的时候先把数组里每个元素初始化为他的下一个数;
  • 并的时候找他能到达的最远的数字就可以了。

代码:

class Solution {
public:
    unordered_map a,b;
    int find(int x){
        return a.count(x)?a[x]=find(a[x]):x;
    }
    int longestConsecutive(vector& nums) {
        for(auto i:nums)
            a[i]=i+1;
        int ans=0;
        for(auto i:nums){
            int y=find(i+1);
            ans=max(ans,y-i);
        }
        return ans;
    }
};

运行结果:

2020-06-06 LeetCode 128 最长连续数列 C++_第2张图片

你可能感兴趣的:(C++,LeetCode,c++,leetcode,算法)