课程表

220 阅读1分钟

题目: 现在你总共有 n 门课需要选,记为 0 到 n-1。

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。

可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。

示例 1:

输入: 2, [[1,0]] 输出: [0,1]

示例 2:

输入: 4, [[1,0],[2,0],[3,1],[3,2]] 输出: [0,1,2,3] or [0,2,1,3]

通过BFS来实现:

//正常的排序
function tpSortBFS1(total, prerequisites) {
  let result = ''

  //用来存储节点的后续节点
  let nodeInfo = []

  //用来存储节点入度情况
  let rdArr = new Array(total).fill(0)

  //转化传入进来的二维数组
  for (let i = 0; i < prerequisites.length; i++) {
    //先决条件
    const prerequisiteNum = prerequisites[i][1]
    const subsequentNum = prerequisites[i][0]
    if (nodeInfo[prerequisiteNum] === undefined) {
      nodeInfo[prerequisiteNum] = [subsequentNum]
    } else {
      nodeInfo[prerequisiteNum].push(subsequentNum)
    }
    console.log('subsequentNum', subsequentNum)
    rdArr[subsequentNum]++
  }
  console.log('nodeInfo', nodeInfo)
  console.log('rdArr入度', rdArr)

  //找到所有入度为零的节点
  const entryArr = []
  for (let i = 0, len = rdArr.length; i < len; i++) {
    if (rdArr[i] === 0) {
      entryArr.push(i)
    }
  }
  // console.log('entryArr', entryArr)
  while (entryArr.length) {
    //找到入度为0的节点,并将该节点放入结果中
    console.log('entryArr', entryArr)

    const node = entryArr.shift()
    // const node = entryArr[parseInt(Math.random())]
    result += node

    //找到该节点的后续节点,将后续节点的入度数做相应的减法
    if (nodeInfo[node] && nodeInfo[node].length > 0) {
      for (let i = 0, len = nodeInfo[node].length; i < len; i++) {
        //当前节点
        const item = nodeInfo[node][i]
        //当前节点的入度减去1
        rdArr[item]--
        if (rdArr[item] === 0) {
          entryArr.push(item)
        }
      }
    }
  }
  console.log('result: ', result)
  return result.length === total ? result : ''
}

DFS实现稍后补上。。。。

思考:基于BFS实现,最终得到一种结果。那如果我想得到更多的结果呢?甚至所有的可能性呢?改如何实现呢?(不管得到所有的结果到底是否有用,但是我就想得到!!!!)

让大脑嗨起来吧。。。

下面是我的解决办法: juejin.cn/post/690281…

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…