สมมติว่าเรามีรายการตัวเลข nums โดย nums[i] แสดงผู้ล่าของสัตว์ตัวที่ i และถ้าไม่มีผู้ล่าจะเก็บค่า -1 เราต้องหาจำนวนกลุ่มน้อยที่สุดของสัตว์ โดยที่ไม่มีสัตว์ตัวใดอยู่ในกลุ่มเดียวกับผู้ล่าตรงๆ หรือผู้ล่าอ้อมๆ ของมัน
ตัวอย่าง: nums = [1, 2, -1, 4, 5, -1] ผลลัพธ์คือ 3 สามารถจัดกลุ่มได้เป็น [0, 3], [1, 4], [2, 5]
ขั้นตอนการแก้ปัญหา
- ถ้า
Aว่าง คืนค่า 0 - สร้าง
adjเป็นแผนที่ (map) ว่าง,visเป็นเซตใหม่,rootsเป็นลิสต์ใหม่ - วนลูปแต่ละ index
iและค่าaในA:- ถ้า
a == -1เพิ่มiเข้าroots - เพิ่ม
aเข้าadj[i]และเพิ่มiเข้าadj[a]
- ถ้า
- กำหนด
best = -infinity - สำหรับแต่ละ
rootในroots:- สร้างสแต็ก
stkใส่[root, 1] - วนลูป while
stkไม่ว่าง:- นำ
(node, d)ออกจากสแต็ก - ถ้า
nodeอยู่ในvisหรือnode == -1ให้ข้าม best = max(best, d)- เพิ่ม
nodeเข้าvis - สำหรับแต่ละ
uในadj[node]ใส่(u, d + 1)เข้าstk
- นำ
- สร้างสแต็ก
- คืนค่า
best
ตัวอย่างโค้ด Python
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)) # Output: 3
อินพุต / เอาต์พุต
Input: [1, 2, -1, 4, 5, -1]
Output: 3