20240221-查找城镇法官

题目要求

在一个小镇上,有 n 个从 1 到 n 的人。有传言说其中有一个人暗地里是小镇法官。

如果镇法官存在,那么

1. 小镇法官不信任任何人。
2. 每个人(除了小镇法官)都信任小镇法官。
3. 正好有一个人满足属性 1 和 2。

给你一个数组 trust,其中 trust[i] = [ai,bi] 表示标有 ai 的人信任标有 bi 的人。如果 trust 数组中不存在信任关系,那么这种信任关系就不存在。

如果小镇法官存在且可以识别,则返回小镇法官的标签,否则返回-1。

Example 1:

Input: n = 2, trust = [[1,2]]
Output: 2

Example 2:

Input: n = 3, trust = [[1,3],[2,3]]
Output: 3

Example 3:

Input: n = 3, trust = [[1,3],[2,3],[3,1]]
Output: -1

思路

如果存在法官那么一定意味着有一个人不信任任何人,也就是他不会出现在trust[i]中的a[i]位置上即可,其次他会在b[i]的位置上出现n-2次。那么寻找元素是否出现和重复出现之类的问题,我们首先想到哈希表。

class Solution {
public:
    int findJudge(int n, vector<vector<int>>& trust) {
        map<int, int> trustCount;
        map<int, int> givenTrust;

        for (const auto& t : trust) {
            trustCount[t[1]]++;
            givenTrust[t[0]] = 1;
        }
        for (int i = 1; i <= n; ++i) {
            if (givenTrust[i] == 0 && trustCount[i] == n-1) {
                return i;
            }
        }
        return -1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值