Course Schedule

LeetCode 207 · View on LeetCode

Determine if all courses can be finished given prerequisite pairs. Uses Kahn's algorithm (BFS topological sort).

How it works: inDegree[i] counts how many unfinished prerequisites course i still has. We start by enqueueing courses with zero prerequisites (they're ready to take). When we "complete" a course, we decrement inDegree for each of its dependents — inDegree[nei]-- means "you needed me, and I'm done now." When a course's in-degree hits 0, all its prerequisites are satisfied, so it becomes takeable (enqueue it). If a cycle exists, some courses never reach 0 and count < numCourses.

package main

import "fmt"

func canFinish(numCourses int, prerequisites [][]int) bool {
	adj := make([][]int, numCourses)
	inDegree := make([]int, numCourses)
	for _, p := range prerequisites {
		crs, pre := p[0], p[1]
		adj[pre] = append(adj[pre], crs)
		inDegree[crs]++
	}

	queue := []int{}
	for i := 0; i < numCourses; i++ {
		if inDegree[i] == 0 {
			queue = append(queue, i)
		}
	}

	count := 0
	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		count++
		for _, nei := range adj[node] {
			inDegree[nei]--
			if inDegree[nei] == 0 {
				queue = append(queue, nei)
			}
		}
	}

	return count == numCourses
}

func main() {
	fmt.Println(canFinish(4, [][]int{{1, 0}, {2, 0}, {3, 1}, {3, 2}})) // true
	fmt.Println(canFinish(2, [][]int{{1, 0}, {0, 1}}))                  // false
}
▶ Open Go Playground

Copy the code above and paste to run

© 2026 ByteLearn.dev. Free courses for developers. · Privacy