题目描述
链接:https://leetcode-cn.com/problems/course-schedule-ii/
代码:
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
# 一个字典用来记录图中每个节点的后续节点
# 一个字典用来记录当前节点的入度数
res = []
if numCourses == 1:return [0]
next_node = defaultdict(list) #查询不存在的键值,返回默认值[]
rudu_num = defaultdict(int) #查询不存在的键值,返回默认值0
for node in prerequisites:
next_node[node[0]].append(node[1])
# print(next_node) test测试
rudu_num[node[1]] += 1
# print(rudu_num) test测试
# print(rudu_num[0])
# print(next_node[5])
# print(next_node1[0])
# print(next_node2[0])
start = 0
finish = 0
while start < numCourses:
# 如果当前节点入度为0,将该节点和相应邻边去掉,即将该节点的后续节点的入度数分别减1
if rudu_num[start] == 0: #rudu_num[start]返回默认值并插入
for node in next_node[start]:
rudu_num[node] -= 1
# print(rudu_num)
res.append(start)
rudu_num[start] = -1 #相当于把该节点去掉
start = 0 #重置start,再遍历一次rudu_num
finish += 1 #去掉节点之后,完成一步
continue
if finish == numCourses: #当所有节点去掉之后,finish可以达到所有课程,就代表无环
res.reverse() #这里因为我做的是从原始节点开始删除的,所以顺序颠倒了,用reverse函数换一下就可以了
return res
start += 1
return []
参考:https://leetcode-cn.com/problems/course-schedule-ii/solution/ru-du-tuo-bu-pai-xu-sui-ran-la-ji-dan-gan-jue-hen-/