题目-中等难度
现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
示例
示例 1:
输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
示例 2:
输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。
示例 3:
输入:numCourses = 1, prerequisites = []
输出:[0]
提示:
- 1 <= numCourses <= 2000
- 0 <= prerequisites.length <= numCourses * (numCourses - 1)
- prerequisites[i].length == 2
- 0 <= ai, bi < numCourses
- ai != bi
- 所有[ai, bi] 互不相同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. bfs
时间
44ms
击败 89.86%使用 Python3 的用户
内存
16.93MB
击败 56.86%使用 Python3 的用户
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
# 初始化需要完成的课程
deg = [0] * numCourses
# 字典存储课程关联的先决条件
dic = defaultdict(list)
# 将需要完成的课程添加到deg, 将完成条件添加到dic键, 关联的值为键上课程完成后可学的课程
for ai,bi in prerequisites:
deg[ai] += 1
dic[bi].append(ai)
# li放入未在deg上的课程, 作为可以第一个完成的课程
li = [i for i,j in enumerate(deg) if j == 0]
# 列表存储课程
res = []
# 当仍然有课程可以完成
while li:
# 获取该课程
a = li.pop(0)
# 添加到res列表
res.append(a)
# 遍历完成课程后完成的后续课程
for i in dic[a]:
# 将后续课程在deg中的值-1
deg[i] -= 1
# 当课程在deg中值为0, 代表该课程可以标记为已完成课程
if deg[i] == 0:
li.append(i)
# 如果最终课程数量与给与的课程数量相同, 返回res, 不然为空
return res if len(res) == numCourses else []