LeetCode第 997 题:找到镇上的法官(C++)

997. 找到小镇的法官 - 力扣(LeetCode)
在这里插入图片描述

一开始的做法是这样的:

class Solution {
public:
    int findJudge(int N, vector<vector<int>>& trust) {
        vector<int> sign(N+1, 0);//i有信任的人,则sign[i] = 1
        vector<int> count(N+1, 0);//信任i的人的个数是count[i]
        for(const auto &v : trust){
            if(!sign[v[0]]) sign[v[0]] = 1;//v[0]有信任的人,必然是村民
            ++count[v[1]];
        }
        //属性1:如果有法官,那么他对应的值应该为0,而且只有他一个人对应的值为0
        auto it = find(sign.begin()+1, sign.end(), 0);
        if(it == sign.end())    return -1;//所有人都有信任的人
        //对于法官,信任他的人数是N-1(属性2)
        if(count[it-sign.begin()] == N-1)   return it - sign.begin();
        return -1;
    }
};

如果用图的思想来考虑:

有向图问题。 并且法官实际上就是出度为0,入度为 N - 1的节点。

class Solution {
public:
    int findJudge(int N, vector<vector<int>>& trust) {
        vector<int> inDegree(N+1, 0);//信任 i 的人
        vector<int> outDegree(N+1, 0);// i 信任的人
        for(const auto &v : trust){
            ++inDegree[v[1]];
            ++outDegree[v[0]];
        }
        for(int i = 1; i <= N; ++i){
            if(inDegree[i] == N-1 && outDegree[i] == 0) return i;
        }
        return -1;
    }
};

一个数组也可以:

参考:【一个数组搞定】通俗易懂(997. 找到小镇的法官) - 找到小镇的法官 - 力扣(LeetCode)

法官是 入度 - 出度 == N - 1 的点,并且不是法官的人不可能是。

class Solution {
public:
    int findJudge(int N, vector<vector<int>>& trust) {
        vector<int> count(N+1, 0);//入度 - 出度的差值
        for(const auto &v : trust){
            ++count[v[1]];
            --count[v[0]];//v[0]指向一个人,说明他的出度+1,差值就会-1
        }

        auto it = find(count.begin()+1, count.end(), N-1);
        return it == count.end() ?  -1 : it - count.begin();
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值