LeetCode 128. 最长连续序列***

具体思想:

具体思路分两种,一种是map哈希,一种是并查集;

使用标准数组hash会超时;

1.map哈希:

map保存是否出现,但是有一个遍历的trick;

如果map[i]出现,则枚举map[i+1];

如果用该方法,则map[i-1]必定已经枚举过,所以必定只需要枚举map[i-1]不存在的元素即可;

2.并查集:

连续相邻的构成一个并查集,这里注意一下示例代码的边查边遍历;

具体代码:

1.map哈希:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        map<int,int>mp;
        for(auto ele:nums){
            mp[ele]=1;
        }
        int cnt=0;
        for(int i=0;i<nums.size();i++){
            if(mp.find(nums[i]-1)==mp.end()){
                int c=0;
                int num=nums[i];
                while(mp.find(num)!=mp.end()){
                    c++;
                    num++;
                }
                cnt=max(c,cnt);
            }
        }
        return cnt;
    }
};

2.并查集:

class Solution {
public:
    // cnt用于记录当前集合的元素个数
    unordered_map<int,int> uf, cnt;

    int find(int i){
        return i == uf[i] ? i: uf[i] = find(uf[i]);
    }

    int merge(int x, int y){
        x = find(x); y = find(y);
        if(x == y) return cnt[x];
        uf[y] = x;
        //更新合并之后的连通分量的元素个数
        cnt[x] += cnt[y];
        return cnt[x];
    }

    int longestConsecutive(vector<int>& nums) {
        if(nums.size() == 0) 
            return 0;
        for(int i: nums) uf[i] = i, cnt[i] = 1;
        int ans = 1;
        for(int i: nums){
            if(i != INT_MAX && uf.count(i+1)) ans = max(ans, merge(i, i+1));
        }
        return ans;
    }
};
上一篇:LeetCode 0007 Reverse Integer


下一篇:Spring全注解开发----Servlet 3.0