Overview
You are given numCourses courses labeled from 0 to numCourses - 1, and an array prerequisites where prerequisites[i] = [a, b] means you must take course b before course a.
Return true if it is possible to finish all courses, or false if there is a circular dependency.
Constraints
1 <= numCourses <= 20000 <= prerequisites.length <= 5000prerequisites[i].length === 20 <= prerequisites[i][0], prerequisites[i][1] < numCourses- All prerequisite pairs are unique.
Examples
canFinish(2, [[1, 0]]); // => true (take course 0 first, then course 1)
canFinish(2, [[1, 0], [0, 1]]); // => false (circular dependency) canFinish(4, [[1, 0], [2, 1], [3, 2]]); // => true (linear chain: 0 -> 1 -> 2 -> 3)
Solution
Reveal solution
function canFinish(numCourses, prerequisites) {
const adj = Array.from({ length: numCourses }, () => []);
const inDegree = new Array(numCourses).fill(0);
for (const [a, b] of prerequisites) {
adj[b].push(a);
inDegree[a]++;
}
const queue = [];
for (let i = 0; i < numCourses; i++) {
if (inDegree[i] === 0) queue.push(i);
}
let completed = 0;
while (queue.length > 0) {
const course = queue.shift();
completed++;
for (const next of adj[course]) {
inDegree[next]--;
if (inDegree[next] === 0) queue.push(next);
}
}
return completed === numCourses;
}Kahn's algorithm for topological sort. If we can process all nodes, there's no cycle.
Resources
course-dependency.js
Course Dependency
mediumcodingAlgorithmsGraphs
Overview
You are given numCourses courses labeled from 0 to numCourses - 1, and an array prerequisites where prerequisites[i] = [a, b] means you must take course b before course a.
Return true if it is possible to finish all courses, or false if there is a circular dependency.
Constraints
1 <= numCourses <= 20000 <= prerequisites.length <= 5000prerequisites[i].length === 20 <= prerequisites[i][0], prerequisites[i][1] < numCourses- All prerequisite pairs are unique.
Examples
canFinish(2, [[1, 0]]); // => true (take course 0 first, then course 1)
canFinish(2, [[1, 0], [0, 1]]); // => false (circular dependency) canFinish(4, [[1, 0], [2, 1], [3, 2]]); // => true (linear chain: 0 -> 1 -> 2 -> 3)
Solution
Reveal solution
function canFinish(numCourses, prerequisites) {
const adj = Array.from({ length: numCourses }, () => []);
const inDegree = new Array(numCourses).fill(0);
for (const [a, b] of prerequisites) {
adj[b].push(a);
inDegree[a]++;
}
const queue = [];
for (let i = 0; i < numCourses; i++) {
if (inDegree[i] === 0) queue.push(i);
}
let completed = 0;
while (queue.length > 0) {
const course = queue.shift();
completed++;
for (const next of adj[course]) {
inDegree[next]--;
if (inDegree[next] === 0) queue.push(next);
}
}
return completed === numCourses;
}Kahn's algorithm for topological sort. If we can process all nodes, there's no cycle.
Resources
NameTopicDifficulty
103 of 103 problems