你这个学期必须选修 numCourses
门课程,记为 0
到 numCourses - 1
。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites
给出,其中 prerequisites[i] = [ai, bi]
,表示如果要学习课程 ai
则 必须 先学习课程 bi
。
- 例如,先修课程对
[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。
请你判断是否可能完成所有课程的学习?如果可以,返回 true
;否则,返回 false
。
示例 1:
输入:numCourses = 2, prerequisites = [[1,0]] 输出:true 解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
示例 2:
输入:numCourses = 2, prerequisites = [[1,0],[0,1]] 输出:false 解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
提示:
1 <= numCourses <= 105
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
0 <= ai, bi < numCourses
prerequisites[i]
中的所有课程对 互不相同
方法一:拓扑排序+BFS
1 /** 2 * @param {number} numCourses 3 * @param {number[][]} prerequisites 4 * @return {boolean} 5 */ 6 var canFinish = function (numCourses, prerequisites) { 7 //入度数组 8 const inDegree = new Array(numCourses).fill(0); 9 //邻接表 10 const map = {}; 11 for (let i = 0; i < prerequisites.length; i++) { 12 inDegree[prerequisites[i][0]]++; 13 if (map[prerequisites[i][1]]) { 14 map[prerequisites[i][1]].push(prerequisites[i][0]); 15 } else { 16 map[prerequisites[i][1]] = [prerequisites[i][0]]; 17 } 18 } 19 const queue = []; 20 for (let i = 0; i < inDegree.length; i++) { 21 if (inDegree[i] == 0) queue.push(i); 22 } 23 let count=0; 24 while(queue.length){ 25 const selected=queue.shift(); 26 count++; 27 const toEnQueue=map[selected]; 28 if(toEnQueue&&toEnQueue.length){ 29 for(let i=0;i<toEnQueue.length;i++){ 30 inDegree[toEnQueue[i]]--; 31 if(inDegree[toEnQueue[i]]===0){ 32 queue.push(toEnQueue[i]); 33 } 34 } 35 } 36 } 37 return count==numCourses; 38 };
标签:map,const,207,prerequisites,numCourses,length,课程,课程表 From: https://www.cnblogs.com/icyyyy/p/16904884.html