题目: 现在你总共有 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…