Java并查集问题

并查集是一种数据结构, 常用于描述集合,经常用于解决此类问题:某个元素是否属于某个集合,或者 某个元素 和 另一个元素是否同属于一个集合。可以用于点的分堆、判断点的互相可达性。

/**
 * @Author: Sumail-Lee
 * @Date: 2019/1/4 15:57
 * @Description: 将一个集合内的点分堆,每个分好堆的点内都互相可达,公用同一个爹
 */
public class 并查集 {
    private int[] parent;
    private int size;

    public 并查集(int size) {
        this.size = size;
        parent = new int[size];
        for (int i = 0; i < size; i++) {
            parent[i] = i;
        }
    }

    public int findParent(int element) {
        while (element != parent[element]) {
            element = parent[element];
        }
        return element;
    }

    public boolean isConnected(int firstElement, int secondElement) {
        return findParent(firstElement) == findParent(secondElement);
    }

    public void unionElements(int firstElement, int secondElement) {
        int firstRoot = findParent(firstElement);
        int secondRoot = findParent(secondElement);
        if (firstRoot == secondRoot) {
            return;
        }
        parent[firstRoot] = secondRoot;
    }
}

 

单例模式线程安全的实现

大家的写法

public class Single {
    private static class Holder {
        static Single instance = new Single();
    }

    private Single() {
    }

    public Single getInstance() {
        return Holder.instance;
    }
}

皮一下的写法,优化后是上面的

public class Single {
    private static Single instance;

    static {
        instance = new Single();
    }

    private Single() {
    }

    public Single getInstance() {
        return instance;
    }
}

 

贪心算法的一些题目

活动安排问题

定义(活动) 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,而在同一时间只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。

继续阅读