1. 力扣997:找到小镇的法官
1.1 题目:
小镇里有 n
个人,按从 1
到 n
的顺序编号。传言称,这些人中有一个暗地里是小镇法官。
如果小镇法官真的存在,那么:
- 小镇法官不会信任任何人。
- 每个人(除了小镇法官)都信任这位小镇法官。
- 只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust
,其中 trust[i] = [ai, bi]
表示编号为 ai
的人信任编号为 bi
的人。
如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -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
提示:
1 <= n <= 1000
0 <= trust.length <= 104
trust[i].length == 2
trust
中的所有trust[i] = [ai, bi]
互不相同ai != bi
1 <= ai, bi <= n
1.2 思路:
限定题目给定的两条信息即可。
1.3 题解:
class Solution {
// 根据题目两个重要的信息
// 小镇法官不会信任任何人
// 每个人(除了小镇法官)都信任这位小镇法官
public int findJudge(int n, int[][] trust) {
int sum = 0;
for(int i = 1; i <= n; i++){
sum += i;
}
// 尝试找到法官
// 由第一条信息,法官不会信任任何人,所以trust[i][0]不会出现法官
int[] arr = new int[n+1];
for(int i = 0; i < trust.length; i++){
if(arr[trust[i][0]] == 0){
sum -= trust[i][0];
arr[trust[i][0]] = 1;
}
}
// 由第二条信息:除了法官其他人都会信任法官
// cnt这个来专门记录除了法官的所有人来对法官的访问
int cnt = 0;
for(int i = 0; i < trust.length; i++){
if(trust[i][1] == sum){
cnt++;
}
}
// 如果cnt不为n-1,说明没有满足第二条
if(cnt != n-1){
return -1;
}
return sum == 0 ? 0 : sum;
}
}