一、题目描述:
在一个小镇里,按从 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-town-judge
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路:
- 小镇的法官不相信任何人----->说明法官不可能出现在trust[i]=[a,b]中的a位置。
- 每个人(除了小镇法官外)都信任小镇的法官->说明法官被信任的次数为N-1。
- 创建一个Map,Map中的Key表示被信任的人(即b),Value表示信任的人出现的次数(即b出现的次数)。
- 我们使用map.remove()除去同时出现在a位置和b位置的元素。map中剩下的key就有可能是法官。
- 将剩余的key放到set集合中,这个时候我们使用set查找是不是有一个key的value长度为N-1,如果找到了,这个人就是法官,就返回key;否则返回-1.
- 如果小镇只有一个人,那么这个人就一定是法官。
三、代码描述:
class Solution {
public int findJudge(int N, int[][] trust) {
if(N==1){
return 1;
}
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<trust.length;i++){
int value=map.getOrDefault(trust[i][1],0);
map.put(trust[i][1],value+1);
}
for(int i=0;i<trust.length;i++){
if(map.containsKey(trust[i][0])){
map.remove(trust[i][0]);
}
}
Set<Integer> set=map.keySet();
for(int m:set){
if(map.get(m)==N-1){
return m;
}
}
return -1;
}
}