Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมนับจำนวนสัตว์ขั้นต่ำที่ไม่มีนักล่าใน Python


สมมติว่าเรามีรายการตัวเลขที่เรียกว่า 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