今日题目
https://leetcode.com/problems/course-schedule-iv/description/
思路
本题需要判断一个节点是否是另一个节点的祖先节点。 对此,我们可以为每个节点维护一个集合,存储其所有祖先节点,然后将该集合向下传递给所有子节点。
方法
- 使用 DFS 遍历所有节点。
- 为每个节点创建一个集合,并将其传递给子节点。
复杂度
-
时间复杂度:$O(N^3 + Q)$。每条边最多被访问一次,集合的传递操作为 $O(N)$,因此总时间复杂度为 $O(N^3 + Q)$。
-
空间复杂度:$O(N^2) + Q$。需要为每个节点存储一个集合,同时还需要存储答案。
代码
class Solution:
def checkIfPrerequisite(self, numCourses: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]:
edges = [[] for _ in range(numCourses)]
prereq = [set([_]) for _ in range(numCourses)]
for x, y in prerequisites:
edges[y].append(x)
def dfs(x):
for to in edges[x]:
if len(prereq[to]) == 1:
dfs(to)
prereq[x] = prereq[x] | prereq[to]
for i in range(numCourses):
dfs(i)
ans = []
for x, y in queries:
if x in prereq[y]:
ans.append(True)
else:
ans.append(False)
return ans