1、题目描述
在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。
如果小镇的法官真的存在,那么:
小镇的法官不相信任何人。
每个人(除了小镇法官外)都信任小镇的法官。
只有一个人同时满足条件 1 和条件 2 。
给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。
如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。
2、算法分析
定义两个数组,分别存储的是一个元素的出度和入度。
令 m 为 trust 数组长度,对于每个 trust[i] = (a, b) 而言,看作是从 a 指向 b 的有向边。
遍历 trust,统计每个节点的「入度」和「出度」:若存在 a -> b,则 a 节点「出度」加一,b 节点「入度」加一。
最后遍历所有点,若存在「入度」数量为 n−1,且「出度」数量为 0 的节点即是法官。
知识补充:
二维数组使用foreach遍历
// 遍历的是每一个二维数组中一维数组的值
int [][]nums={{1,2,3},{4,5,6},{7,8,9}};
for(int[]i:nums){
int a = i[0];
int b = i[1];
int c = i[2];
}
3、代码实现
class Solution {
public int findJudge(int n, int[][] trust) {
int[] in = new int[n+1];
int[] out = new int[n+1];
// 遍历二维数组中的一位数组的元素
for(int[] arr:trust){
int a = arr[0];
int b = arr[1];
out[a]++;
in[b]++;
}
// 判断入度和出度的值
for(int i = 1;i <= n;i++){
if(in[i] == n - 1 && out[i] == 0){
return i;
}
}
return -1;
}
}