207.课程表
你这个学期必须选修 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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix