LeetCode算法题解 997-找到小镇的法官

题目描述

题解:

解法1::模拟法
法官应该满足的条件:

  1. 被信任N-1次(也就是在truct[i][1]出现了N-1次)
  2. 没有信任过别人(也就是这个人不会出现在truct[i][0]中)
    具体看代码吧,其中还使用了map来记录下出现的次数。
    注意:当只有一个人时,也就是当N=1,不会有信任的情况,也就是truct数组为空,那么这个人就是法官。
    解法2:转换为图的问题(其实也是在模拟)
    N个人,N个节点,看哪个节点的出度为0,入度为N-1。
    使用node[N+1][2]数组来记录下每个节点的出度和入度情况,比如使用node[1][0]、node[1][1]分别表示节
    点1的出度和入度。

代码:

class Solution {
public:
    int findJudge(int N, vector<vector<int>>& trust) {
        /* 1. 模拟法 
        if(N == 1)
        {
            return 1;
        }
        //truct[0][0],truct[0][1];
        map <int,int> mp;// mp[a]=value,表示a被信任了value次
        for(int i = 0; i < (int)trust.size(); i++)
        {
            mp[trust[i][1]]++;
        }
        for(map<int,int>::iterator it = mp.begin(); it != mp.end(); it++)
        {
            if(it->second == N-1)
            {
                int tmp = it->first;
                bool flag = true;// 判断tmp是否只是作为被认识的出现了N-1次,如果还认识别人就是false
                for(int i = 0; i < (int)trust.size(); i++)
                {
                    if(trust[i][0] == tmp)
                    {
                        flag = false;
                    }
                }
                if(flag)
                {
                    return tmp;
                }
            }
        }
        return -1;*/
        /* 2. 转换成求图的问题,N个人,N个节点,看哪个节点的出度为0,入度为N-1 */
        int node[N+1][2];// i节点的出度:node[i][0] 入度:node[i][1]
        memset(node,0,sizeof(node));
        for(int i = 0; i < trust.size(); i++)
        {
            node[trust[i][0]][0]++;
            node[trust[i][1]][1]++;
        }
        for(int i = 1; i <= N; i++)
        {
            if(node[i][0] == 0 && node[i][1] == N-1)
            {
                return i;
            }
        }
        return -1;
    }
};
发布了197 篇原创文章 · 获赞 18 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41708792/article/details/102864820