Python每日一练-----找到小镇的法官(有向图)
⛅(day11)
目录
🖍题目:
题目分析:
解题思路:
代码实现
代码注释
🖍题目:
小镇里有 n
个人,按从 1
到 n
的顺序编号。传言称,这些人中有一个暗地里是小镇法官👨⚖️。
如果小镇法官真的存在,那么:
- 小镇法官不会信任任何人。
- 每个人(除了小镇法官)都信任这位小镇法官。
- 只有一个人同时满足属性 1 和属性 2 。
给你一个数组 trust(trust
中的所有trust[i] = [ai, bi]
互不相同,trust[i].length ==2)
,其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。
如果小镇法官存在并且可以确定他的身份,请返回该法官的编号;否则,返回 -1 。
🌠示例 1:
输入:n = 2, trust = [[1,2]]
序号为1的人信任序号为2的人
解释:所人都信任2
输出:2
🌠示例 2:
输入:n = 3, trust = [[1,3],[2,3]]
1信任3,2信任3
解释:所有人都信任3
输出:3
🌠示例 3:
输入:n = 3, trust = [[1,3],[2,3],[3,1]]
1信任3,2信任3,3信任1
解释:没有人获得所有人的信任
输出:-1
题目分析:
所法官就是获得所有人的信任,而他不信任其他人的人。
解题思路:
这道题比较适合使用有向图解题。什么是有向图?
先来简单了解有向图
这是有向图的一种简单形式 。
在有向图中,一个节点(a,b,c,d)的入度是指向该节点的边的数量;而一个节点的出度是从该节点出发的边的数量。
a的出度为3,入度为0
c入度为1,出度为2
现在将箭头看作信任。如a----->b,说明a信任b。
由题目可知
有法官时
法官获得全部的信任
无法官时
没人活得全部的信任
我们可以遍历每个节点的入度和出度,如果找到一个符合条件的节点,因为只有一个法官,我们可以直接返回结果;如果不存在符合条件的点,则返回 -1。
因为有n个人,法官获得除他外所有人的信任,所以法官的有n-1个指向他的箭头,即法官的出度为n-1
1.可以创建两个标识into表示入度, out出度
2.接着统计是否有人存在出度为n-1
3.如果有,则为法官如果没有返回-1
代码实现
from collections import Counterdef findJudge(n, trust): into = Counter(y for _, y in trust) out = Counter(x for x, _ in trust) return next((i for i in range(1, n + 1) if into[i] == n - 1 and out[i] == 0), -1)
代码注释
✨y for _, y in trust遍历并提取trust[i][1]”_“处可填入任意变量
例:
trust = [[1,3],[2,3], [3,1]]for i, j in trust: print(i, j)s输出:
1 3
2 3
3 1
✨Counter()函数
用于计算各元素出现的次数
例:list = [a, b, c, a, c,]
输出:Counter({a:2, b:1,c:2 })
✨next函数
语法next(iterator, [default])
iterator为迭代器,default为默认返回值
例:
pop = (i for i in range(2))print(next(pop, -1))print(next(pop, -1))print(next(pop, -1))s输出:
0
1
-1
每次调用next()只输出一个值,当遍历完后再调用则会输出默认值
完成。
❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄