题目描述
题目描述可见LeetCode 997. 找到小镇的法官对应题目的链接。
这道题目大概的意思是,假定现在有 n n n个人,其中可能有一个法官。法官具有的属性是,法官不相信任何人,而其它 n − 1 n-1 n−1个人都相信法官。
现在给定 n n n和 t r u s t trust trust数组,其中 t r u s t trust trust是一个二维数组,其中是人与人之间信任关系的记录,比如 [ 1 , 2 ] [1, 2] [1,2]表示 p e r s o n 1 person_1 person1信任 p e r s o n 2 person_2 person2。
思路
一开始看到这道题目我以为要使用暴力法求解,但是仔细一想这不应该是最后的思路。
看了题解之后才发现,这道题可以使用图结构来做。具体来说,可以将每个人抽象为结点,将信任关系抽象为边,统计每个人的入度和出度,即可在 O ( n ) O(n) O(n)内解决这道题。
如果小镇中有法官,那么法官的入度一定是 n − 1 n-1 n−1,而出度是 0 0 0。
class Solution {
public:
int findJudge(int n, vector<vector<int>>& trust) {
vector<int> inDegrees(n+1);
vector<int> outDegrees(n+1);
for(auto & edge : trust) {
int in = edge[1], out = edge[0];
inDegrees[in] ++;
outDegrees[out] ++;
}
for(int i=1; i<=n; i++) {
if(inDegrees[i] == n-1 && outDegrees[i] == 0) {
return i;
}
}
return -1;
}
};