在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。
如果小镇的法官真的存在,那么:
小镇的法官不相信任何人。
每个人(除了小镇法官外)都信任小镇的法官。
只有一个人同时满足条件 1 和条件 2 。
给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。
如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。
示例 1:
输入:n = 2, trust = [[1,2]]
输出:2
示例 2:
输入:n = 3, trust = [[1,3],[2,3]]
输出:3
示例 3:
输入:n = 3, trust = [[1,3],[2,3],[3,1]]
输出:-1
示例 4:
输入:n = 3, trust = [[1,2],[2,3]]
输出:-1
示例 5:
输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
输出:3
提示:
1 <= n <= 1000
0 <= trust.length <= 104
trust[i].length == 2
trust[i] 互不相同
trust[i][0] != trust[i][1]
1 <= trust[i][0], trust[i][1] <= n
奇葩小镇,找到法官
一个pInt记录指向关系
一个valMap算出法官
一个keySet用于算出法官是否合法
#include <iostream>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
class Solution {
public:
int findJudge(int n, vector<vector<int>>& trust) {
int sum = 0;
int keyJudge = 0;
int calJudge = 0;
set<int> keySet;
unordered_map<int, int> valMap; //记录val值的大小
unordered_map<int, vector<int>> pInt; //记录指向关系
if (trust.empty() && n== 1) {
return n;
}
for (int i = 0; i < trust.size(); i++) {
keySet.insert(trust[i][0]);
keySet.insert(trust[i][1]);
pInt[trust[i][0]].push_back(trust[i][1]);
if (valMap.count(trust[i][1]) == 0) {
valMap[trust[i][1]] = 1;
}
else {
valMap[trust[i][1]]++;
}
}
/* 先算法官是哪个 */
unordered_map<int, int>::iterator iHash = valMap.begin();
while (iHash != valMap.end()) {
if (iHash->second > sum) {
sum = iHash->second;
keyJudge = iHash->first;
}
iHash++;
}
cout << "keyJudge:" << keyJudge << endl;
set<int>::iterator it = keySet.begin();
while (it != keySet.end()) {
if (!isHeTrustJudge(pInt, *it, keyJudge, calJudge)) {
return -1;
}
it++;
}
/* 计算法官数量,超过1个返回 */
if (calJudge != 1) {
return -1;
}
return keyJudge;
}
/* calJudge返回法官数量,keyJudge判断是否信任法官 */
bool isHeTrustJudge(unordered_map<int, vector<int>>& judgeVec,int key, int keyJudge, int& calJudge) {
if (judgeVec.count(key) == 0) {
calJudge++;
}
else {
/* 信任的人里面是否有法官 */
vector<int> it = judgeVec[key];
for (int i = 0; i < it.size(); i++) {
if (it[i] == keyJudge && key !=keyJudge) {
return true;
}
}
return false;
}
return true;
}
};
int main() {
vector<vector<int>> v = { {3, 2},{4, 1},{3, 1},{2, 1},{2, 3},{4, 3},{4, 2},{3, 4} };
unique_ptr<Solution> ptr;
cout << ptr->findJudge(4, v) << endl;
return 0;
}