原题
In a town, there are N people labelled from 1 to N. There is a rumor that one of these people is secretly the town judge.
If the town judge exists, then:
The town judge trusts nobody.
Everybody (except for the town judge) trusts the town judge.
There is exactly one person that satisfies properties 1 and 2.
You are given trust, an array of pairs trust[i] = [a, b] representing that the person labelled a trusts the person labelled b.
If the town judge exists and can be identified, return the label of the town judge. Otherwise, return -1.
Example 1:
Input: N = 2, trust = [[1,2]]
Output: 2
Example 2:
Input: N = 3, trust = [[1,3],[2,3]]
Output: 3
Example 3:
Input: N = 3, trust = [[1,3],[2,3],[3,1]]
Output: -1
Example 4:
Input: N = 3, trust = [[1,2],[2,3]]
Output: -1
Example 5:
Input: N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
Output: 3
Note:
- 1 <= N <= 1000
- trust.length <= 10000
- trust[i] are all different
- trust[i][0] != trust[i][1]
- 1 <= trust[i][0], trust[i][1] <= N
翻译
在一个小镇上, 有N个人分别标记为 1到 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
程序
int findJudge(int N, int** trust, int trustSize, int* trustColSize){
if(trustSize==0)return N;
int d[N+1][2];
//为二位数组赋初值 不知道又没有办法省略
for(int i=1;i<N+1;++i)
{
d[i][1]=0;
d[i][0]=0;
}
for(int i=0;i<trustSize;++i)
{
++(d[trust[i][0]][0]);
++(d[trust[i][1]][1]);
}
for(int i=1;i<N+1;++i)
{
if((d[i][1]-d[i][0])==N-1)return i;
}
return -1;
}
总结
- 图的出度入度概念,只要计算出每个人的出度入度,入度减出度为N-1的人就是法官
- 二维数组初始化有些麻烦