课程表Ⅱ
题目描述:
解题思路:
- 第一种:广度优先搜索。
- 这个方法和之前的 课程表Ⅰ 里的很像。都用到了拓扑排序。主要的思路也是建立入度表和邻接表,将入度为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 []