图论刷题记录

1. 找到小镇的法官

997. 找到小镇的法官

小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。

如果小镇法官真的存在,那么:

  1. 小镇法官不会信任任何人。
  2. 每个人(除了小镇法官)都信任这位小镇法官。
  3. 只有一个人同时满足属性 1 和属性 2 。

给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。

如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。

示例 1:

输入:n = 2, trust = [[1,2]]
输出:2

思路:

理解一下题意,就是说小镇上只有一个法官,这个人不会相信任何人,而其他人都会相信他;

可以把镇上的信任关系抽象成一个图,只要检查这个图中每个顶点的出度和入度即可。

小镇法官就是出度为0,入度为n-1的那个顶点。【出度表示信任其他人,入度表示被别人信任】

class Solution {
     public int findJudge(int n, int[][] trust) {
        // 出度数组,因为点数分布在 1~n, 所以此处多存储一个顶点 0,方便处理。对于下面的入度数组同理。  
        int[] outDegrees = new int[n + 1];
        // 入度数组
        int[] inDegrees = new int[n + 1]; 
        
        // 遍历边集 trust
        for (int[] edge : trust) {
            int u = edge[0], v = edge[1]; // 起点和终点
            outDegrees[u]++; // 起点出度 + 1
            inDegrees[v]++; // 终点入度 + 1
        }

        // 忽略顶点 0,寻找出度为 0,入度为 n-1 的顶点。
        for (int v = 1; v <= n; v++) {
            if (outDegrees[v] == 0 && inDegrees[v] == n - 1) {
                return v;
            }
        }
        
        // 小镇法官不存在
        return -1;
    }
}

你可能感兴趣的:(图论)