课程表Ⅱ
题目描述:


解题思路:
- 第一种:广度优先搜索。
- 这个方法和之前的 课程表Ⅰ 里的很像。都用到了拓扑排序。主要的思路也是建立入度表和邻接表,将入度为0的边依次
append到res中。然后再对res进行遍历,将其每个结点的邻接结点入度减一,如果入度变为0,则加入res中。最后的判断和上次的也很类似,我们设置一个出队个数参数temp,每次遍历都会加1,最后如果出对个数等于课程次数,则返回res,否则,说明形成了环,则不可能完成所有课程,即返回空数组[]。 - 时间复杂度:O(N + M)
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
in_Frame = [0 for _ in range(numCourses)]
out_Frame = [[] for _ in range(numCourses)]
for cur, pre in prerequisites:
in_Frame[cur] += 1
out_Frame[pre].append(cur)
res = []
for i in range(numCourses):
if in_Frame[i] == 0:
res.append(i)
temp = 0
while temp != len(res):
x = res[temp]
temp += 1
for j in out_Frame[x]:
in_Frame[j] -= 1
if in_Frame[j] == 0:
res.append(j)
if temp == numCourses:
return res
else:
return []

本文详细介绍了使用广度优先搜索解决课程表Ⅱ问题的方法,通过建立入度表和邻接表,实现拓扑排序,判断是否能完成所有课程。最终返回课程完成顺序或空数组。

494

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



