找到小镇的法官-力扣997

87 阅读1分钟

找到小镇的法官

依据题意,只需找到入度为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

时间复杂度:O(n+m)O(n+m),构造邻接表O(m)O(m),遍历邻接表O(n+m)O(n+m),遍历出度和入度数组O(n)O(n)

空间复杂度:O(n+m)O(n+m),构造邻接表O(n+m)O(n+m), 构造出度和入度数组O(n)O(n)