Skip to content

Commit 7098de2

Browse files
author
robot
committed
feat: 997
1 parent d124415 commit 7098de2

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

problems/997.find-the-town-judge.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
## 题目地址(997. 找到小镇的法官)
2+
3+
https://leetcode-cn.com/problems/find-the-town-judge/
4+
5+
## 题目描述
6+
7+
```
8+
在一个小镇里,按从 1 到 n 为 n 个人进行编号。传言称,这些人中有一个是小镇上的秘密法官。
9+
10+
如果小镇的法官真的存在,那么:
11+
12+
小镇的法官不相信任何人。
13+
每个人(除了小镇法官外)都信任小镇的法官。
14+
只有一个人同时满足条件 1 和条件 2 。
15+
16+
给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示编号为 a 的人信任编号为 b 的人。
17+
18+
如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的编号。否则,返回 -1。
19+
20+
 
21+
22+
示例 1:
23+
24+
输入:n = 2, trust = [[1,2]]
25+
输出:2
26+
27+
28+
示例 2:
29+
30+
输入:n = 3, trust = [[1,3],[2,3]]
31+
输出:3
32+
33+
34+
示例 3:
35+
36+
输入:n = 3, trust = [[1,3],[2,3],[3,1]]
37+
输出:-1
38+
39+
40+
示例 4:
41+
42+
输入:n = 3, trust = [[1,2],[2,3]]
43+
输出:-1
44+
45+
46+
示例 5:
47+
48+
输入:n = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
49+
输出:3
50+
51+
 
52+
53+
提示:
54+
55+
1 <= n <= 1000
56+
0 <= trust.length <= 104
57+
trust[i].length == 2
58+
trust[i] 互不相同
59+
trust[i][0] != trust[i][1]
60+
1 <= trust[i][0], trust[i][1] <= n
61+
```
62+
63+
## 前置知识
64+
65+
-
66+
67+
## 公司
68+
69+
- 暂无
70+
71+
## 思路
72+
73+
我们可以将小镇中的人们之间的信任关系抽象为图的边,那么图中的点自然就是小镇中的人。这样问题就转化为**求图中入度(或出度)为 n - 1 并且出度(或入度)为 0**的点。
74+
75+
究竟是入度还是出度取决于你对边的定义。比如我定义:a 信任 b 表示图中有一条从顶点 a 到顶点 b 的有向边,那么此时我们要找的是**入度为 n - 1 并且出度为 0**的点。反之,我定义:a 信任 b 表示图中有一条从顶点 b 到顶点 a 的有向边,那么此时我们要找的是**出度为 n - 1,入度为 0**的点。
76+
77+
这里我们不妨使用第一种定义方式,即找图中入度为 n - 1 ,出度为 0 的点。
78+
79+
算法:
80+
81+
- 初始化长度为 n 的两个数组 in_degree 和 out_degree,分别表示入度和出度信息,比如 in_degree[i] 表示顶点 i 的入度为 in_degress[i]。其中 n 为人数,也就是图中的顶点数。
82+
- 接下来根据题目给的 trust 关系建图。由于我们定义图的方式为**a 信任 b 表示图中有一条从顶点 a 到顶点 b 的有向边**。因此如果 a 信任 b,那么 a 的出度 + 1,b 的入度 -1 。
83+
- 最后遍历 in_degree 和 out_degree 找到满足 in_degree[i] 为 n - 1,并且 out_degress[i] 为 0 的点,返回即可。如果没有这样的点返回 -1。
84+
85+
## 关键点
86+
87+
- 将问题抽象为图,问题转为求图的入度和出度
88+
89+
## 代码
90+
91+
- 语言支持:Python3
92+
93+
Python3 Code:
94+
95+
```python
96+
97+
class Solution:
98+
def findJudge(self, N, trust):
99+
in_degree = [0] * (N + 1)
100+
out_degree = [0] * (N + 1)
101+
for a, b in trust:
102+
in_degree[b] += 1
103+
out_degree[a] += 1
104+
for i in range(1, N + 1):
105+
if in_degree[i] == N - 1 and out_degree[i] == 0:
106+
return i
107+
return -1
108+
109+
```
110+
111+
我们也可以直接统计入度和出度的差,因为我们要找的是入度和出度差为 n -1 的点。这样可以将两个数组降低为一个数组,不过复杂度是一样的。
112+
113+
```py
114+
class Solution:
115+
def findJudge(self, N, trust):
116+
count = [0] * (N + 1)
117+
for i, j in trust:
118+
count[i] -= 1
119+
count[j] += 1
120+
for i in range(1, N + 1):
121+
if count[i] == N - 1:
122+
return i
123+
return -1
124+
```
125+
126+
**复杂度分析**
127+
128+
令 n 为数组长度。
129+
130+
- 时间复杂度:$O(n)$
131+
- 空间复杂度:$O(n)$
132+
133+
> 此题解由 [力扣刷题插件](https://leetcode-pp.github.io/leetcode-cheat/?tab=solution-template) 自动生成。
134+
135+
力扣的小伙伴可以[关注我](https://leetcode-cn.com/u/fe-lucifer/),这样就会第一时间收到我的动态啦~
136+
137+
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
138+
139+
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
140+
141+
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gfcuzagjalj30p00dwabs.jpg)

0 commit comments

Comments
 (0)