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

mac2025-12-31  4

题目描述

题解:

解法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; } };
最新回复(0)