ホーム LeetCode 997. 町の判事を探す
記事
キャンセル

LeetCode 997. 町の判事を探す

image

問題リンク

次数による判定

信頼関係 [a, b] を、人 a から人 b への有向辺として考える。町の判事は誰も信頼しないため、出次数は 0 である。また、それ以外の全員が判事を信頼するため、入次数は n - 1 となる。両方の条件を確認する必要がある。入次数だけで判定すると、ほかの人を信頼している人を誤って判事に選ぶ可能性がある。

全員の入次数と出次数を数え、両方の条件を満たす人を返す。n == 1 の場合、唯一の人の入次数と出次数はいずれも 0 なので、信頼関係がないときに限り条件を満たす。特別な分岐を設けなくても同じ走査で処理できる。該当する人がいなければ -1 を返す。

信頼関係を m = trust.length 個それぞれ一度処理し、さらに n 人を確認するため、時間計算量は O(n + m) である。二つの次数配列に必要な追加領域は O(n) となる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
    public int findJudge(int n, int[][] trust) {
        int[] indegree = new int[n + 1];
        int[] outdegree = new int[n + 1];

        for (int[] relation : trust) {
            outdegree[relation[0]]++;
            indegree[relation[1]]++;
        }

        for (int person = 1; person <= n; person++) {
            if (outdegree[person] == 0 && indegree[person] == n - 1) {
                return person;
            }
        }
        return -1;
    }
}
この記事は著者により CC BY 4.0 ライセンスで公開されています。