We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Difficulty: 中等
Related Topics: 深度优先搜索, 广度优先搜索, 图, 拓扑排序
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
numCourses
0
numCourses - 1
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。
prerequisites
[0, 1]
1
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
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 。这是不可能的。
提示:
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
prerequisites[i]
Language: JavaScript
/** * @param {number} numCourses * @param {number[][]} prerequisites * @return {boolean} */ // 一共有n门课要上,编号为0~n-1 // 先决条件[1,0],意思是必须先上课0,才能上课1 // 给你n,和一个先决条件表,请你判断能否完成所有课程 // 示例:n = 6,先决条件表:[[3, 0], [3, 1], [4, 1], [4, 2], [5, 3], [5, 4]] // 课 0, 1, 2 没有先修课,可以直接选。其余的课,都有两门先修课。 // 这种叫 有向无环图,把一个 有向无环图 转成 线性的排序 就叫 拓扑排序。 // 有向图有 入度 和 出度 的概念: // 如果存在一条有向边 A --> B,则这条边给 A 增加了 1 个出度,给 B 增加了 1 个入度。 // 所以,顶点 0、1、2 的入度为 0。顶点 3、4、5 的入度为 2。 const canFinish = (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++) { // 所有入度为0的课入列 if (inDegree[i] == 0) queue.push(i); } let count = 0; while (queue.length) { const selected = queue.shift(); // 当前选的课,出列 count++; // 选课数+1 const toEnQueue = map[selected]; // 获取这门课对应的后续课 if (toEnQueue && toEnQueue.length) { // 确实有后续课 for (let i = 0; i < toEnQueue.length; i++) { inDegree[toEnQueue[i]]--; // 依赖它的后续课的入度-1 if (inDegree[toEnQueue[i]] == 0) { // 如果因此减为0,入列 queue.push(toEnQueue[i]); } } } } return count == numCourses; // 选了的课等于总课数,true,否则false };
The text was updated successfully, but these errors were encountered:
No branches or pull requests
207. 课程表
Description
Difficulty: 中等
Related Topics: 深度优先搜索, 广度优先搜索, 图, 拓扑排序
你这个学期必须选修
numCourses
门课程,记为0
到numCourses - 1
。在选修某些课程之前需要一些先修课程。 先修课程按数组
prerequisites
给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。请你判断是否可能完成所有课程的学习?如果可以,返回
true
;否则,返回false
。示例 1:
示例 2:
提示:
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
prerequisites[i]
中的所有课程对 互不相同Solution
Language: JavaScript
The text was updated successfully, but these errors were encountered: