BiruLyu
6/19/2017 - 9:04 PM

128. Longest Consecutive Sequence.java

public class Solution {
        public int longestConsecutive(int[] nums) {
            UF uf = new UF(nums.length);
            Map<Integer,Integer> map = new HashMap<Integer,Integer>(); // <value,index>
            for(int i=0; i<nums.length; i++){
                if(map.containsKey(nums[i])){
                    continue;
                }
                map.put(nums[i],i);
                if(map.containsKey(nums[i]+1)){
                    uf.union(i,map.get(nums[i]+1));
                }
                if(map.containsKey(nums[i]-1)){
                    uf.union(i,map.get(nums[i]-1));
                }
            }
            return uf.maxUnion();
        }
    }
    
    class UF{
        private int[] list;
        public UF(int n){
            list = new int[n];
            for(int i=0; i<n; i++){
                list[i] = i;
            }
        }
        
        private int root(int i){
            while(i!=list[i]){
                list[i] = list[list[i]];
                i = list[i];
            }
            return i;
        }
        
        public boolean connected(int i, int j){
            return root(i) == root(j);
        }
        
        public void union(int p, int q){
          int i = root(p);
          int j = root(q);
          list[i] = j;
        }
        
        // returns the maxium size of union
        public int maxUnion(){ // O(n)
            int[] count = new int[list.length];
            int max = 0;
            for(int i=0; i<list.length; i++){
                count[root(i)] ++;
                max = Math.max(max, count[root(i)]);
            }
            return max;
        }
    }
class UnionFind
{
private:
    unordered_map<int, int> father;
    unordered_map<int, int> ssize;
    
public:
    int find(int x)
    {
        int parent = x;
        while(parent != father[parent]) parent = father[parent];
        int bigdaddy = parent;
        
        while(x != father[x])
        {
            int tmp = father[x];
            father[x] = bigdaddy;
            x = tmp;
        }
        return bigdaddy;
    }
    
    void union_(int a, int b)
    {
        int fa = find(a);
        int fb = find(b);
        if (fa != fb)
        {
            father[fa] = fb;
            ssize[fa] = ssize[fb] = ssize[fa] + ssize[fb];
        }
    }
    
    UnionFind(vector<int> &nums)
    {
        for (int i = 0; i < nums.size(); i++)
        {
            father[nums[i]] = nums[i];
            ssize[nums[i]] = 1;
        }
    }
    
    int getmaxsize()
    {
        int result = 0;
        for (auto it : ssize) result = max(result, it.second);
        return result;
    }

};

class Solution
{
public:
    int longestConsecutive(vector<int>& nums)
    {
        UnionFind uf = UnionFind(nums);
        unordered_set<int> s;
        for (int i = 0; i < nums.size(); i++) s.insert(nums[i]);
        
        for (int i = 0; i < nums.size(); i++)
        {
            if (s.count(nums[i] - 1)) uf.union_(nums[i], nums[i] - 1);
            if (s.count(nums[i] + 1)) uf.union_(nums[i] + 1, nums[i]);
        }
        return uf.getmaxsize();
    }
};
public class Solution {
public int longestConsecutive(int[] nums) {
    if(nums == null || nums.length == 0) return 0;
    
    Set<Integer> set = new HashSet<Integer>();
    
    for(int num: nums) set.add(num);
    int max = 1;
    for(int num: nums) {
        if(set.remove(num)) {//num hasn't been visited
            int val = num;
            int sum = 1;
            while(set.remove(val-1)) val--;
            sum += num - val;
            
            val = num;
            while(set.remove(val+1)) val++;
            sum += val - num;
            
            max = Math.max(max, sum);
        }
    }
    return max;
}
}
public class Solution {
    public int longestConsecutive(int[] nums) {
        int res = 0;
        if (nums == null || nums.length == 0) return res;
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (int num : nums) {
            if(!map.containsKey(num)) {
                int left = map.containsKey(num - 1) ? map.get(num - 1) : 0;
                int right = map.containsKey(num + 1) ? map.get(num + 1) : 0;
                int sum = left + right + 1;
                map.put(num, sum);
                res = Math.max(res, sum);
                map.put(num - left, sum);
                map.put(num + right, sum);
            }
        }
        return res;
    }
}