851. 喧闹和富有

题目主要是先通过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)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值