假设我们有一个称为nums的数字列表,其中nums [i]显示第i种动物的捕食者,如果没有捕食者,则它将保持-1。我们必须找到最少数量的动物,以使没有任何动物与其直接或间接捕食者处于同一组。
因此,如果输入像nums = [1、2,-1、4、5,-1],那么输出将是3,因为我们可以拥有类似[0,3],[1,4]的组],[2,5]。
为了解决这个问题,我们将遵循以下步骤-
如果A为空,则
返回0
adj:=空白映射
vis:=一个新的集合
roots:=一个新列表
对于每个索引i和A中的值a
在根的末尾插入i
如果a与-1相同,则
在adj [i]的末尾插入a
在adj [a]的末尾插入i
最佳:=-无穷大
对于根中的每个根,
(节点,d):= stk的弹出元素
如果node在vis或node与-1相同,则
最佳:=最佳和d的最大值
将节点插入vis
对于adj [node]中的每个u,执行
从循环中出来
将(u,d + 1)推入stk
stk:=一个堆栈,并在其中插入[root,1]
当stk不为空时,执行
最好的回报
让我们看下面的实现以更好地理解-
from collections import defaultdict class Solution: def solve(self, A): if not A: return 0 adj = defaultdict(list) vis = set() roots = [] for i, a in enumerate(A): if a == -1: roots.append(i) adj[i].append(a) adj[a].append(i) best = −float("inf") for root in roots: stk = [(root, 1)] while stk: node, d = stk.pop() if node in vis or node == −1: continue best = max(best, d) vis.add(node) for u in adj[node]: stk.append((u, d + 1)) return best ob = Solution()nums = [1, 2, −1, 4, 5, −1] print(ob.solve(nums))
[1, 2, −1, 4, 5, −1]
输出结果
3