Python 程序:计算没有捕食者的动物的最小数量
假设我们有一个名为 nums 的数字列表,其中 nums[i] 表示第 i 个动物的捕食者,如果没有捕食者,则它将包含 -1。我们需要找到动物组的最小数量,使得任何动物都不与其直接或间接的捕食者在同一组中。
因此,如果输入类似于 nums = [1, 2, -1, 4, 5, -1],则输出将为 3,因为我们可以有如下分组:[0, 3],[1, 4],[2, 5]。
为了解决这个问题,我们将遵循以下步骤 -
如果 A 为空,则
返回 0
adj := 一个空映射
vis := 一个新的集合
roots := 一个新的列表
对于 A 中的每个索引 i 和值 a,执行以下操作
如果 a 等于 -1,则
将 i 插入到 roots 的末尾
将 a 插入到 adj[i] 的末尾
将 i 插入到 adj[a] 的末尾
best := -infinity
对于 roots 中的每个根,执行以下操作
stk := 一个栈,并将 [root, 1] 插入其中
当 stk 不为空时,执行以下操作
(node, d) := stk 弹出的元素
如果 node 在 vis 中或 node 等于 -1,则
退出循环
best := best 和 d 的最大值
将 node 插入到 vis 中
对于 adj[node] 中的每个 u,执行以下操作
将 (u, d + 1) 推入 stk
返回 best
让我们看看下面的实现,以便更好地理解 -
示例
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
广告