/**[图][简单] 在一个小镇里,按从 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 trust.length <= 10000 trust[i] 是完全不同的 trust[i][0] != trust[i][1] 1 <= trust[i][0], trust[i][1] <= N */ /* 思路1: 每个人看成图的一个顶点,组成有向图,出度是信任别人的人数,入度是被人信任的人数。 由题可知,法官的出度是0,入度是N-1 总结:本题只需要关注每个顶点的出入度即可,不要关注各顶点之间的关系。 */ class Solution { public int findJudge(int N, int[][] trust) { //1.得到每个人的出度和入度 int[][] people = new int[N][2];//int数组默认值为0 int in,out; for(int[] person : trust){ out = person[0]; in = person[1]; people[out-1][0]++;//出度+1 people[in-1][1]++;//入度+1 } //2.找到出度为0,入度为N-1的人 for(int i = 0; i < N; i++){ if(people[i][0] == 0 && people[i][1] == N-1){//符合条件的人必然不多于1个 return i + 1; } } return -1; } }