Back to challenges
Hard 0 solved 0% acceptance

Course Schedule Order

Order courses so every prerequisite comes first.

What you'll learn

  • Order tasks by prerequisites with Kahn's algorithm
  • Track in-degrees with a queue
  • Detect impossible schedules

Problem

Courses are numbered 0..n−1. Each pair [course, prerequisite] means the prerequisite must be taken before the course. Return an order to take all courses; when several courses are available, take the lowest-numbered one first so the answer is unique.

Implement course_order(n, prerequisites).

Input

n: The number of courses. prerequisites: Pairs [course, prerequisite].

Output

Return the course order, or an empty list if a cycle makes it impossible.

Constraints

1 ≤ n ≤ 100,000; 0 ≤ pairs ≤ 200,000

Examples

Example 1
Input:
n = 4
prerequisites = [
    [1, 0],
    [2, 0],
    [3, 1],
    [3, 2]
]

Expected output:
expected = [0, 1, 2, 3]
Input:
long long n = 4;
std::vector<std::vector<long long>> prerequisites = {
    {1, 0},
    {2, 0},
    {3, 1},
    {3, 2}
};

Expected output:
std::vector<long long> expected = {0, 1, 2, 3};
Input:
long n = 4;
long[][] prerequisites = new long[][] {
    new long[] {1, 0},
    new long[] {2, 0},
    new long[] {3, 1},
    new long[] {3, 2}
};

Expected output:
long[] expected = new long[] {0, 1, 2, 3};

Explanation

0 first, then 1 and 2 (lowest first), then 3: [0, 1, 2, 3].

Example 2
Input:
n = 2
prerequisites = [
    [0, 1],
    [1, 0]
]

Expected output:
expected = []
Input:
long long n = 2;
std::vector<std::vector<long long>> prerequisites = {
    {0, 1},
    {1, 0}
};

Expected output:
std::vector<long long> expected = {};
Input:
long n = 2;
long[][] prerequisites = new long[][] {
    new long[] {0, 1},
    new long[] {1, 0}
};

Expected output:
long[] expected = new long[] {};

Explanation

Each course requires the other, so no order exists: [].

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

This is a dependency ordering problem: courses with no unmet prerequisites must be taken first.

Hint 2

Use topological sorting, and when multiple courses are ready, always choose the smallest-numbered one to make the order deterministic.

Hint 3

If you cannot process all courses, a cycle exists; also, duplicate prerequisite pairs should not break the result.

Expected complexity

O(n + p log n) time, O(n + p) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.