一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
- 在一个小镇里,按从 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
七【解题思路】
- 根据题意可知,法官不相信任何人也就是法官的出度为0,所有人都相信法官也就是法官的入度为N-1,所以只要遍历二维数组最后出度为0,入度为N-1的那个人就是法官
八【时间频度】
九【代码实现】
- Java语言版
package Graph;
public class p997_FindTheTownJudge {
public static void main(String[] args) {
p997_FindTheTownJudge p997_findTheTownJudge = new p997_FindTheTownJudge();
int N = 3;
int[][] trust = {
{1, 3},
{2, 3},
};
int res = p997_findTheTownJudge.findJudge(N, trust);
System.out.println("res = " + res);
}
public int findJudge(int N, int[][] trust) {
int[] count = new int[N + 1];
for (int[] row : trust) {
count[row[0]]--;
count[row[1]]++;
}
for (int i = 1; i <= N; i++) {
if (count[i] == N - 1) {
return i;
}
}
return -1;
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
int findJudge(int N, int** trust, int trustSize, int* trustColSize) {
int cnt[999999 + 1];
memset(cnt, 0, sizeof(int) * (N + 1));
for (int i = 0; i < trustSize; i++)
{
if (cnt[trust[i][1]] >= 0)
{
cnt[trust[i][1]]++;
}
cnt[trust[i][0]] = -1;
}
for (int i = 1; i <= N; i++)
{
if (cnt[i] == N - 1)
{
return i;
}
}
return -1;
}
int main(void) {
}
十【提交结果】
- Java语言版
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/145182cbce5f9a66bee7e4f2090bb667.png#pic_center)
- C语言版
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cb0971f09af7f90aa0c944574b63491f.png#pic_center)