通过万岁!!!
- 题目:一个m行2列的数组,然后里面存储的是一个信任关系。每一行[a,b]表示a新人b,然后找到一个法官。法官的特征是所有人都新人她,但是她不新人任何人。并且小镇上有n个人。如果没有法官就返回-1,否则返回这个人的编号。
- 思路:定义两个数组(当然这里可以用map,但是数组也可以,因为我们知道大小)。trued:trued[i]表示新人i这个人的有多少个;tru:tru[i]表示i新人的人有多少个。注意法官是trued一定是n-1的,因为所有人都信任她;法官的tru一定是0,因为她不相信任何人。
- 技巧:
- 这里就是用两个数组去记录,信任的人的个数和被多少人信任的个数,而法官在这里是可以进行区分的。
- 需要注意,我之前想过用一个数组,信任的时候- -,被信任的时候++,然后最后这个值= =n-1,但是这样存在一个特例子,就是所有人都信任你,但是你刚好信任一个人。这时候就还是= =n-1的。
伪代码
定义数组trued和tru,长度是n+1,这里我们不用0,因为人的编号就是从1开始的。
for遍历数组
trued[trust[i][1]]++,表示trust[i][1]又被一个人信任了
tru[trust[i][0]]++,表示trust[i][0]又信任了一个人
for遍历两个数组,
如果trued[i]==n-1并且tru[i]==0,表示被所有人信任,但是不信任任何人,这时候return 1
最后 return -1;表示不存在法官
java代码
class Solution {
public int findJudge(int n, int[][] trust) {
int trued[] = new int[n + 1]; // 0不用,tru[i]表示信任i的人的个数
int tru[] = new int[n + 1];// 0不用,trued[i]表示i新人的人的个数
for (int i = 0; i < trust.length; i++) {
trued[trust[i][1]]++;
tru[trust[i][0]]++;
}
for (int i = 1; i <= n; i++) {
if (trued[i] == n - 1 && tru[i] == 0) {// 所有人都信任她,但是她不新人任何人
return i;
}
}
return -1;
}
}
- 总结:题目不是很难,主要是知道法官具有什么特点,然后我们根据这个特点,挑选出来就行了。