思路:
创建入度数组填充为0,存放对应索引值位置的入度
创建邻接表存储对应的键值,需要先修的课程为建,依赖于它的课程为值
将所有入度为0的元素入列,即为没有依赖先修课程的课程
将队列中不依赖先修的课程出列,匹配map中所对应的依赖于这些课程的后续课程,对他们的入度--
如果入度为0了,则将其加入到队列中
最后返回课程数与出队的课程数是否相等,相等则说明可以修完
var canFinish = function (numCourses, prerequisites) {
const inDegree = new Array(numCourses).fill(0);
const map = {};
for (let i = 0; i < prerequisites.length; i++) {
inDegree[prerequisites[i][0]]++;
if(map[prerequisites[i][1]]){
map[prerequisites[i][1]].push(prerequisites[i][0]);
}else{
map[prerequisites[i][1]] = [prerequisites[i][0]];
}
}
const queue = [];
for (let i = 0; i < inDegree.length; i++) {
if(inDegree[i] === 0) queue.push(i);
}
let count = 0;
while (queue.length){
const selected = queue.shift();
count++;
const toEnqueue = map[selected];
if(toEnqueue){
for (let i = 0; i < toEnqueue.length; i++) {
inDegree[toEnqueue[i]]--;
if(inDegree[toEnqueue[i]] === 0)
queue.push(toEnqueue[i]);
}
}
}
return count === numCourses;
}
重点在于搞清楚map,toEnqueue,inDegree,selected之间的关系