leetcode 128. 最长连续序列

79 阅读1分钟

c++

class Solution {
public:
    class UnionSet {
    public:
        int *father, *cnt , n;
        UnionSet(int n) : n(n) {
            father = new int[n + 1];
            cnt = new int[n + 1]; 
            for (int i = 0; i <= n; i++) {
                father[i] = i;
                cnt[i] = 1;
            }
        }
        int find(int x) {
            return father[x] = (father[x] == x ? x : find(father[x]));
        }
        void merge(int a, int b) {
            if (find(a) == find(b)) return ;
            cnt[find(b)] += cnt[find(a)];
            father[find(a)] = find(b);
            return ;
        }
    };
    int longestConsecutive(vector<int>& nums) {
        UnionSet u(nums.size());
        unordered_map<int, int> _map;
        for (int i = 0; i < nums.size(); i++) {
            if (_map.find(nums[i]) != _map.end()) continue;
            if (_map.find(nums[i] - 1) != _map.end()) {
                u.merge(i, _map[nums[i] - 1]);
            } 
            if (_map.find(nums[i] + 1) != _map.end()) {
                u.merge(i, _map[nums[i] + 1]);
            }
            _map[nums[i]] = i;
        }
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (u.find(i) == i && ans < u.cnt[i]) ans = u.cnt[i]; 
        }
        return ans;
    }
};

js

class UnionSet {
    constructor(n) {
        this.father = new Array(n);
        this.cnt = new Array(n);
        for (var i = 0; i < n; i++) {
            this.father[i] = i;
            this.cnt[i] = 1;
        }
    }
    find(x) {
        return this.father[x] = (this.father[x] == x ? x : this.find(this.father[x]));
    }
    merge(a, b) {
        this.cnt[this.find(b)] += this.cnt[this.find(a)];
        this.father[this.find(a)] = this.find(b); 
    } 
};
var longestConsecutive = function(nums) {
    var _map = new Map();
    var u = new UnionSet(nums.length);
    for (var i = 0; i < nums.length; i++) {
        if (_map.has(nums[i])) continue;
        if (_map.has(nums[i] - 1)) {
            u.merge(i, _map.get(nums[i] - 1));
        }
        if (_map.has(nums[i] + 1)) {
            u.merge(i, _map.get(nums[i] + 1));
        }
        _map.set(nums[i], i);
    }
    var ans = 0;
    for (var i = 0; i < nums.length; i++) {
        if (u.find(i) == i) ans = Math.max(ans, u.cnt[i]);
    }
    return ans;
};