210. Course Schedule II

136 阅读1分钟

题目描述

leetcode-cn.com/problems/co…

分析

同课程表 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 : []
}