สมมติว่าเรามีรายการค่า 2 มิติที่เรียกว่า 'tree' ซึ่งแสดงถึง n-ary tree และรายการค่าอื่นที่เรียกว่า 'color' ต้นไม้จะแสดงเป็นรายการที่อยู่ติดกันและรากของมันคือต้นไม้[0].
ลักษณะของโหนดที่ i -
-
tree[i] คือลูกและพ่อแม่ของมัน
-
color[i] คือสีของมัน
เราเรียกโหนด N ว่า "พิเศษ" หากทุกโหนดในทรีย่อยที่มีรูทอยู่ที่ N มีสีเฉพาะ เรามีต้นไม้ต้นนี้ ต้องหาจำนวนโหนดพิเศษ
So, if the input is like tree = [ [1,2], [0], [0,3], [2] ]
สี =[1, 2, 1, 1] แล้วผลลัพธ์จะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ผลลัพธ์ :=0
-
dfs(0, -1)
-
ส่งคืนผลลัพธ์
-
กำหนดฟังก์ชัน check_intersection() นี่จะใช้เวลาสี child_colors
-
ถ้า length of (colors)
-
สำหรับแต่ละ c ในสี ทำ
-
ถ้า c ใน child_colors ไม่ใช่ศูนย์ แล้ว
-
คืนค่า True
-
-
-
-
มิฉะนั้น
-
สำหรับแต่ละ c ใน child_colors ทำ
-
ถ้า c มีอยู่ใน child_colors แล้ว
-
คืนค่า True
-
-
-
-
-
กำหนดฟังก์ชัน dfs() สิ่งนี้จะใช้โหนดก่อนหน้า
-
สี :={สี[โหนด]}
-
สำหรับเด็กแต่ละคนใน tree[node] ทำ
-
ถ้าลูกไม่เหมือนเดิมแล้ว
-
child_colors :=dfs(ลูก, โหนด)
-
หากสีและ child_colors ไม่ว่างเปล่า
-
ถ้า check_intersection(colors, child_colors) ไม่ใช่ศูนย์ แล้ว
-
สี :=null
-
-
มิฉะนั้น
-
ถ้าความยาวของ (สี) <ความยาวของ (child_colors) แล้ว
-
child_colors :=child_colors หรือสี
-
สี :=child_colors
-
-
มิฉะนั้น
-
สี :=สี OR child_colors
-
-
-
-
มิฉะนั้น
-
สี :=null
-
-
-
ถ้าสีไม่หมดก็
-
ผลลัพธ์ :=ผลลัพธ์ + 1
-
-
คืนค่าสี
-
-
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
import collections class Solution: def solve(self, tree, color): self.result = 0 def dfs(node, prev): colors = {color[node]} for child in tree[node]: if child != prev: child_colors = dfs(child, node) if colors and child_colors: if self.check_intersection(colors, child_colors): colors = None else: if len(colors) < len(child_colors): child_colors |= colors colors = child_colors else: colors |= child_colors else: colors = None if colors: self.result += 1 return colors dfs(0, -1) return self.result def check_intersection(self, colors, child_colors): if len(colors) < len(child_colors): for c in colors: if c in child_colors: return True else: for c in child_colors: if c in colors: return True ob = Solution() print(ob.solve( [ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]))
อินพุต
[ [1,2], [0], [0,3], [2] ], [1, 2, 1, 1]
ผลลัพธ์
2