依据题意,只需找到入度为n-1,出度为0的结点,该结点即为法官。另开两个结点分别记录各顶点的出度和入度,再对有向图邻接表进行遍历,将结果填入出度和入度数组中即可得到所有顶点的出度和入度信息。
有向图邻接表的构造
int edgesNum = trust.size();
for(int i = 0; i < edgesNum; i ++){ // 创建有向图
int x = trust[i][0], y = trust[i][1];
adj[x].push_back(y); // 结点x有边指向y
}
本题解法
class Solution {
public:
int findJudge(int n, vector<vector<int>>& trust) {
vector<vector<int>> adj(n + 1); // 注意题目是从1开始编号的
vector<int> ruDu(n + 1, 0);
vector<int> chuDu(n + 1, 0);
int edgesNum = trust.size();
for(int i = 0; i < edgesNum; i ++){ // 创建有向图
int x = trust[i][0], y = trust[i][1];
adj[x].push_back(y); // 结点x有边指向y
}
// 遍历该有向图,如果存在结点入度为n-1,出度为0,则该结点为法官
for(int i = 1; i <= n; i ++){
int len = adj[i].size(); //边表长度
chuDu[i] = len;
for(int j = 0; j < len; j ++)ruDu[adj[i][j]]++;
}
// 在出度和入度数组中找到符合要求的顶点
for(int i = 1; i <= n; i ++){
if(ruDu[i] == n - 1 && chuDu[i] == 0) return i;
}
return -1;
}
};
顶点数n,边数m
时间复杂度:,构造邻接表,遍历邻接表,遍历出度和入度数组
空间复杂度:,构造邻接表, 构造出度和入度数组