题目描述

链接: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-/
本文介绍了一种解决课程安排问题的方法,通过使用拓扑排序算法,实现对有向无环图的课程依赖关系进行排序,确保学生能够按照正确的顺序修读课程。文章详细解释了算法的具体实现过程,包括节点的入度计算、节点移除策略及结果反转等关键步骤。

398

被折叠的 条评论
为什么被折叠?



