题目描述
分析
同课程表 1,但是本题需要统计所有能上的课,并且是按照顺序,如果没法上完所有,返回空数组
能否完成课程实际上是看是否存在没法学习的课程
因此本题我的解题思路是将所有的课程从没有依赖的开始,寻找他们的关系
形成一个拓扑结构,最终检查是否有剩余课程
算法
拓扑排序
过程
统计
统计每个节点的入度,将结构放到 indeg 数组
统计每个节点指向的节点,这是为了拓扑排序,将结果放到 g
遍历 indeg 数组,将没有入度的节点放入队列 q,作为查找的开始节点
查找
利用一个基数器 order 统计已上课程数量
从 q 不断弹出元素,每次弹出后:
- 放入
order,作为已经上完的课程 - 让它指向的节点入度--
- 如果减小入度后发现有入度为 0 的,放入
q
检查
看上完的课程是否等于课程总数
代码
/**
* @param {number} numCourses
* @param {number[][]} prerequisites
* @return {number[]}
*/
var findOrder = function (numCourses, prerequisites) {
let indeg = new Array(numCourses).fill(0)
let g = new Array(numCourses).fill(0).map(() => new Array())
let q = []
for (const x of prerequisites) {
indeg[x[0]]++
g[x[1]].push(x[0])
}
for (let i = 0; i < indeg.length; i++) {
if (indeg[i] === 0) q.push(i)
}
const ret = []
while (q.length) {
const course = q.pop()
ret.push(course)
for (const c of g[course]) {
indeg[c]--
if (!indeg[c]) q.push(c)
}
}
return ret.length === numCourses ? ret : []
}