在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。

    如果小镇的法官真的存在,那么:

    小镇的法官不相信任何人。
    每个人(除了小镇法官外)都信任小镇的法官。
    只有一个人同时满足条件 1 和条件 2 。
    给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。

    如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。

    示例 1:

    输入:n = 2, trust = [[1,2]]
    输出:2
    示例 2:

    输入:n = 3, trust = [[1,3],[2,3]]
    输出:3
    示例 3:

    输入:n = 3, trust = [[1,3],[2,3],[3,1]]
    输出:-1
    示例 4:

    输入:n = 3, trust = [[1,2],[2,3]]
    输出:-1
    示例 5:

    输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
    输出:3

    提示:

    1 <= n <= 1000
    0 <= trust.length <= 104
    trust[i].length == 2
    trust[i] 互不相同
    trust[i][0] != trust[i][1]
    1 <= trust[i][0], trust[i][1] <= n


    1. class Solution {
    2. /**
    3. 本题实质是统计出度入度数,当一个人出度是0且入度是n-1时即为法官
    4. */
    5. static int N = 1010, M = 10010;
    6. int[] h = new int[N];
    7. int[] e = new int[M];
    8. int[] ne = new int[M];
    9. int idx;
    10. public void add (int x, int y) {
    11. e[idx] = y; ne[idx] = h[x]; h[x] = idx++;
    12. }
    13. public int findJudge(int n, int[][] trust) {
    14. int m = trust.length;
    15. int[] cnts1 = new int[n+1]; //统计出度
    16. int[] cnts2 = new int[n+1]; //统计入度
    17. for (int i = 0; i < m; ++i) {
    18. add(trust[i][0],trust[0][1]);
    19. cnts1[trust[i][0]] ++;
    20. cnts2[trust[i][1]] ++;
    21. }
    22. for (int i = 1; i <= n; ++i) {
    23. //当出度为0且入度为n-1就为法官
    24. if (cnts1[i] == 0 && cnts2[i] == n-1) return i;
    25. }
    26. return -1;
    27. }
    28. }
    1. class Solution {
    2. /**
    3. 本题实质是统计出度入度数,当一个人出度是0且入度是n-1时即为法官
    4. */
    5. // static int N = 1010, M = 10010;
    6. // int[] h = new int[N];
    7. // int[] e = new int[M];
    8. // int[] ne = new int[M];
    9. // int idx;
    10. // public void add (int x, int y) {
    11. // e[idx] = y; ne[idx] = h[x]; h[x] = idx++;
    12. // }
    13. public int findJudge(int n, int[][] trust) {
    14. int m = trust.length;
    15. int[] cnts1 = new int[n+1]; //统计出度
    16. int[] cnts2 = new int[n+1]; //统计入度
    17. for (int i = 0; i < m; ++i) {
    18. // add(trust[i][0],trust[0][1]);
    19. cnts1[trust[i][0]] ++;
    20. cnts2[trust[i][1]] ++;
    21. }
    22. for (int i = 1; i <= n; ++i) {
    23. //当出度为0且入度为n-1就为法官
    24. if (cnts1[i] == 0 && cnts2[i] == n-1) return i;
    25. }
    26. return -1;
    27. }
    28. }