Daily LeetCode – day0079 0886. Possible Bipartition

import java.util.ArrayList;
import java.util.LinkedList;

// 0886. Possible Bipartition
class Solution {
    public boolean possibleBipartition(int n, int[][] dislikes) {
        UnionFind unionFind = new UnionFind(n + 1);
        ArrayList<LinkedList<Integer>> enemiesByNumber = new ArrayList<>();
        for (int i = 0; i <= n; ++i) enemiesByNumber.add(new LinkedList<>());
        for (int[] dislike : dislikes) {
            enemiesByNumber.get(dislike[0]).add(dislike[1]);
            enemiesByNumber.get(dislike[1]).add(dislike[0]);
        }
        for (int i = 1; i <= n; ++i) {
            LinkedList<Integer> enemies = enemiesByNumber.get(i);
            if (!enemies.isEmpty()) {
                Integer enemiesFirst = enemies.getFirst();
                for (Integer enemy : enemies) {
                    if (unionFind.find(i) == unionFind.find(enemy)) {
                        return false;
                    }
                    unionFind.union(enemiesFirst, enemy);
                }
            }
        }
        return true;
    }
}

class UnionFind {
    int[] parent;

    public UnionFind(int n) {
        parent = new int[n];
        for (int i = 0; i < n; ++i) {
            parent[i] = i;
        }
    }

    public int find(int son) {
        if (parent[son] == son) {
            return son;
        }
        parent[son] = find(parent[son]);
        return parent[son];
    }

    public void union(int a, int b) {
        int parentOfA = find(a);
        int parentOfB = find(b);
        if (parentOfA != parentOfB) {
            parent[parentOfA] = parentOfB;
        }
    }
}
学习笔记:
今天是一道染色相关的问题,深搜光搜都可以做的。
但是我觉得没大难度的话还是复习并查集吧。
但是一下子也没想通,看了一些题解后才想通。
一开始每个人老大是自己,然后每次遍历一个人的敌人,就要把他的敌人都丢去第一个敌人的帮派。一旦发现有敌人出现在自己的帮派说明发生了矛盾,就直接返回false。


关于樊轶群

一个善良的理想主义者。
此条目发表在每日LeetCode分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注