JZX轻语:简

LeetCode每日一题(20240404) - 有向无环图中一个节点的所有祖先

发表于2024年04月04日

思路比较直观,就是利用拓扑排序的想法,每次寻找入度为0的节点,然后更新子节点的祖先数据和入度即可,直至所有的节点都遍历完毕(因为没有环,最终所有的节点都会入度为0)。

寻找入度为0的节点的过程可以利用队列优化下,使用队列维护当前入度为0的节点,当处理子节点的时候若子节点的入度也变为0了,则将该子节点推入队列即可。

from collections import deque

class Solution:
    def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        adjList = [[] for _ in range(n)]
        result = [set() for _ in range(n)]
        in_ = [0] * n

        for edge in edges:
            u, v = edge
            adjList[u].append(v)
            in_[v] += 1

        zero_in_degree = deque(node for node in range(n) if in_[node] == 0)

        while zero_in_degree:
            node = zero_in_degree.popleft()  # type: int

            for child in adjList[node]:
                in_[child] -= 1
                result[child].add(node)
                result[child] |= result[node]

                if in_[child] == 0:
                    zero_in_degree.append(child)

        return [sorted(list(item)) for item in result]

闪念标签:LC

题目链接:https://leetcode.cn/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/description/