Course Schedule
Medium
GraphTopological SortDFSBFS
Problem
There are n courses (0..n−1) with prerequisites — prereq[i] = [a, b] means you must take b before a. Return true iff you can finish all courses.
Example 1
Input: n=2, prereq=[[1,0]]
Output: true
Example 2
Input: n=2, prereq=[[1,0],[0,1]]
Output: false
Constraints
- 1 ≤ n ≤ 2000
- 0 ≤ prereq.length ≤ 5000
Approach — Graphs
This is a Graphs problem. The idea: explore the graph with BFS or DFS, marking nodes visited so you never process one twice. Work through the reference code below line by line, then re-derive it yourself in the editor — that's how the pattern sticks.
Complexity: O(V + E) time.
Solution code
Python
class Solution:
def canFinish(self, numCourses, prerequisites):
from collections import deque, defaultdict
graph = defaultdict(list)
indeg = [0] * numCourses
for a, b in prerequisites:
graph[b].append(a)
indeg[a] += 1
q = deque(i for i in range(numCourses) if indeg[i] == 0)
seen = 0
while q:
n = q.popleft()
seen += 1
for m in graph[n]:
indeg[m] -= 1
if indeg[m] == 0:
q.append(m)
return seen == numCourses
Java
import java.util.*;
class Solution {
public boolean canFinish(int n, int[][] prereq) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < n; i++) adj.add(new ArrayList<>());
int[] indeg = new int[n];
for (int[] p : prereq) { adj.get(p[1]).add(p[0]); indeg[p[0]]++; }
Deque<Integer> q = new ArrayDeque<>();
for (int i = 0; i < n; i++) if (indeg[i] == 0) q.offer(i);
int taken = 0;
while (!q.isEmpty()) {
int u = q.poll(); taken++;
for (int v : adj.get(u)) if (--indeg[v] == 0) q.offer(v);
}
return taken == n;
}
}
Practice it
Reading a solution isn't the same as being able to write it under pressure. Open this problem in the in-browser editor, hide the solution, and solve it from scratch — your code runs against real test cases instantly.
Solve Course Schedule interactively → ← All solutions