Leetcode: Most Stones Removed wi

2020-06-13  本文已影响0人  akak18183

题目

分析

乍看之下,有点摸不着头脑。稍微举几个简单的例子,就能发现其中的规律。
题目给出一个“相连”的概念,即行或者列相同,这里可以用坐标系来理解。
那么,首先分析一些基本情况:

// T:O(NlogN) S:O(N)
class Solution {
    public int removeStones(int[][] stones) {
        int N = stones.length;
        DSU dsu = new DSU(20000);

        for (int[] stone: stones)
            dsu.union(stone[0], stone[1] + 10000);

        Set<Integer> seen = new HashSet();
        for (int[] stone: stones)
            seen.add(dsu.find(stone[0]));

        return N - seen.size();
    }
}

class DSU {
    int[] parent;
    public DSU(int N) {
        parent = new int[N];
        for (int i = 0; i < N; ++i)
            parent[i] = i;
    }
    public int find(int x) {
        if (parent[x] != x) parent[x] = find(parent[x]);
        return parent[x];
    }
    public void union(int x, int y) {
        parent[find(x)] = find(y);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读