题解:
解法1::模拟法
法官应该满足的条件:
- 被信任N-1次(也就是在truct[i][1]出现了N-1次)
- 没有信任过别人(也就是这个人不会出现在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;
}
};