「每日LeetCode」2021年12月19日

本文最后更新于:2023年3月19日 晚上

  1. 找到小镇的法官

997. 找到小镇的法官

在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。
如果小镇的法官真的存在,那么:

  1. 小镇的法官不相信任何人。
  2. 每个人(除了小镇法官外)都信任小镇的法官。
  3. 只有一个人同时满足条件 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

思路

遍历 trust,用哈希表的形式记录每个节点的入度和出度。记录以后再遍历每个节点,判断入度为 n-1 而出度为 0,返回该节点,否则返回-1.

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @param {number} n
* @param {number[][]} trust
* @return {number}
*/
var findJudge = function (n, trust) {
if (n <= 1) return n;
const map = {};
for (const [input, output] of trust) {
if (!map[input]) map[input] = [new Set(), new Set()];
if (!map[output]) map[output] = [new Set(), new Set()];
map[input][0].add(output);
map[output][1].add(input);
}
for (const [key, value] of Object.entries(map)) {
const [input, output] = value;
if (input.size === 0 && output.size === n - 1) return +key;
}
return -1;
};