并查集

通常用来求一个图中连通的个数。对于连通的图,会选一个节点作为他们的主节点

1.给定未排序的整数数组,找到最长连续元素序列的长度。您的算法应该以O(n)复杂度运行。(leetcode128)

对于任意一个连续的序列,其中所有节点的额主节点都是最大的那一个,所以这一题,可以用并差集的思想

class Solution {
    private Map<Integer, Integer> parent;//key是自己,value是主节点
    public int longestConsecutive(int[] nums) {
        if(nums.length == 0) return 0;
        parent = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            parent.putIfAbsent(nums[i], nums[i]);
        }
        
        int max = 1;
        for(int i = 0; i < nums.length; i++) {
            int root = find(nums[i]);
            max = Math.max(max, root - nums[i] + 1);
        }
        
        return max;
    }
    
    
    private int find(int i) {
        int key = i;
        while(parent.containsKey(key + 1)) {
            int nkey = parent.get(parent.get(key + 1));
            parent.put(i, nkey);
            key = nkey;
        }
        return key;
    }
}

2.顺丰科技8.29的那一题。

posted @ 2019-08-30 15:53  LeeJuly  阅读(89)  评论(0)    收藏  举报