题目主要是先通过richer条件,求每个 person x,所有拥有的钱不少于 person x 的人的集合
随后,要求求出每个 person x对应的集合中,安静值最小的人
转化思路:
将richer条件转化为一个有向图,在python可以通过字典 graph = defaultdict(list) 来存储
然后由于每个点的answer,一定包含在每个点的安静值 或 对应集合中的点的answer中,所以可以通过深度优先搜索来解决。
剪枝:
已经有answer值的点,就可以直接返回answer值了
小细节:
用List时一直显示 “name ‘List’ is not defined” ,找了很多地方都没有找到原因,后来在一个Stack Overflow上看到需要在开头加一个 from typing import List。
PS:本题自己没有想出来,基本上是仿照评论区的题解思路写的orz
from typing import List
class Solution:
def loudAndRich(self, richer: List[List[int]], quiet: List[int]) -> List[int]:
from collections import defaultdict
graph = defaultdict(list)
for rich in richer:
graph[rich[1]].append(rich[0])
n = len(quiet)
res = [-1] * n
def dfs(person):
if res[person] >= 0:
return res[person]
res[person] = person
for i in graph[person]:
if quiet[res[person]] > quiet[dfs(i)]:
res[person] = res[i]
return res[person]
for i in range(n):
dfs(i)
return res
if __name__ == '__main__':
richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]]
quiet = [3,2,5,4,6,1,7,0]
solution = Solution()
ans = solution.loudAndRich(richer, quiet)
print(ans)