题目:小镇里有 n 个人,按从 1 到 n 的顺序编号。传言称,这些人中有一个暗地里是小镇法官。如果小镇法官真的存在,那么:小镇法官不会信任任何人。每个人(除了小镇法官)都信任这位小镇法官。只有一个人同时满足属性 1 和属性 2 。给你一个数组 trust ,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -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
程序说明:
方法一: 因为小镇法官不相信任何人,所以小镇法官只可能在[ai,bi]的bi的位置,因此首先排除掉a列表里面等于ai的元素,留下的便是小镇法官,接着判断bi为小镇法官(即信任法官的)有几个,最后若个数等于n-1即可返回法官。
方法二:使用了有向图的思想,在法官存在的情况下,因为法官不相信任何人,因此法官这个节点的入度是 n-1,出度是 0。我们可以遍历每个节点的入度和出度,如果找到一个符合条件的节点,由于题目保证只有一个法官,我们可以直接返回结果;如果不存在符合条件的点,则返回 -1。
全部代码:
class Solution:
def findJudge(self, n: int, trust: List[List[int]]) -> int:
a=[]
for i in range(n):
a.append(i+1)
for i in range(len(trust)):
if trust[i][0] in a:
a.remove(trust[i][0])
for i in a:
b=0
for j in trust:
if j[1]==i:
b+=1
if b ==n-1:
return i
return -1
方法二:
class Solution:
def findJudge(self, n: int, trust: List[List[int]]) -> int:
inDegrees = Counter(y for _, y in trust)
outDegrees = Counter(x for x, _ in trust)
return next((i for i in range(1, n + 1) if inDegrees[i] == n - 1 and outDegrees[i] == 0), -1)
来源:力扣(LeetCode)