Intuition
A prerequisite [a, b] means edge b → a. You can take all courses iff the
graph is a DAG — equivalent to "every course can be drained by repeatedly
removing those with zero unmet prerequisites."
Explanation
Approach
- Build adjacency list and in-degree counts.
- Enqueue every course with in-degree 0.
- Pop one; for each neighbor, decrement its in-degree; if it hits 0, enqueue.
- If we popped all
numCourses, returnTrue.
Implementation
import java.util.*;
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<List<Integer>> graph = new ArrayList<>();
int[] indeg = new int[numCourses];
for (int i = 0; i < numCourses; i++) graph.add(new ArrayList<>());
for (int[] p : prerequisites) {
graph.get(p[1]).add(p[0]);
indeg[p[0]]++;
}
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
if (indeg[i] == 0) q.add(i);
}
int taken = 0;
while (!q.isEmpty()) {
int u = q.poll();
taken++;
for (int v : graph.get(u)) {
indeg[v]--;
if (indeg[v] == 0) q.add(v);
}
}
return taken == numCourses;
}
}