nums[i]가 i번째 동물의 포식자를 표시하고 포식자가 없으면 -1을 유지하는 nums라는 숫자 목록이 있다고 가정합니다. 직간접적인 포식자와 같은 그룹에 동물이 포함되지 않도록 가장 작은 수의 동물 그룹을 찾아야 합니다.
따라서 입력이 nums =[1, 2, −1, 4, 5, −1]과 같으면 출력은 [0, 3], [1, 4]와 같은 그룹을 가질 수 있으므로 3이 됩니다. ], [2, 5].
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
A가 비어 있으면
-
0 반환
-
-
adj :=빈 지도
-
vis :=새로운 세트
-
루트 :=새 목록
-
각 인덱스 i와 A의 값에 대해 수행
-
a가 -1과 같으면
-
루트 끝에 i 삽입
-
-
adj[i]
끝에 삽입 -
adj[a]
끝에 i 삽입
-
-
최고 :=−무한대
-
루트의 각 루트에 대해 수행
-
stk :=스택에 [루트, 1]을 삽입
-
stk가 비어 있지 않은 동안 수행
-
(노드, d) :=stk의 팝된 요소
-
노드가 vis에 있거나 노드가 -1과 같으면
-
루프에서 나오다
-
-
최고 :=최고 및 d의 최대값
-
vis에 노드 삽입
-
adj[node]의 각 u에 대해 수행
-
(u, d + 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