สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums โดยที่ nums[i] แสดงถึงผู้ล่าของสัตว์ตัวนั้น และหากไม่มีผู้ล่า มันก็จะมีค่า -1 เราต้องหากลุ่มสัตว์ให้น้อยที่สุดเพื่อไม่ให้มีสัตว์กลุ่มเดียวกับนักล่าโดยตรงหรือโดยอ้อม
ดังนั้น หากอินพุตเป็น nums =[1, 2, -1, 4, 5, −1] เอาต์พุตจะเป็น 3 เนื่องจากเราสามารถมีกลุ่มต่างๆ เช่น [0, 3], [1, 4 ], [2, 5].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ถ้า A ว่างเปล่า แล้ว
-
คืนค่า 0
-
-
adj :=แผนที่เปล่า
-
vis :=ชุดใหม่
-
root :=รายการใหม่
-
สำหรับแต่ละดัชนี i และค่า a ใน A ทำ
-
ถ้า a เหมือนกับ -1 แล้ว
-
ใส่ i ที่ปลายราก
-
-
ใส่ a ต่อท้าย adj[i]
-
ใส่ i ต่อท้าย adj[a]
-
-
ดีที่สุด :=−อินฟินิตี้
-
สำหรับแต่ละรูตในรูต ให้ทำ
-
stk :=a stack และใส่ [root, 1] เข้าไป
-
ในขณะที่ stk ไม่ว่างเปล่าให้ทำ
-
(โหนด, d) :=องค์ประกอบที่โผล่ของ stk
-
หากโหนดอยู่ใน vis หรือโหนดเหมือนกับ -1 ดังนั้น
-
ออกจากวง
-
-
ดีที่สุด :=สูงสุดของดีที่สุดและ d
-
แทรกโหนดลงใน vis
-
สำหรับแต่ละคุณใน adj[โหนด] ทำ
-
กด (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