【LeetCode】【C++】997. 找到小镇的法官

题目描述

题目描述可见LeetCode 997. 找到小镇的法官对应题目的链接。

这道题目大概的意思是,假定现在有 n n n个人,其中可能有一个法官。法官具有的属性是,法官不相信任何人,而其它 n − 1 n-1 n1个人都相信法官。

现在给定 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 n1,而出度是 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值