跳至主要內容

拓扑排序

小于 1 分钟

拓扑排序

题目难度
207. 课程表open in new window中等
210. 课程表 IIopen in new window中等
630. 课程表 IIIopen in new window困难贪心
1462. 课程表 IVopen in new window中等Floyd 最短路
$1136. 并行课程open in new window 中等
1494. 并行课程 IIopen in new window困难状态压缩 动态规划
2050. 并行课程 IIIopen in new window困难拓扑排序 动态规划

Kahn 算法

210. 课程表 II

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

public class Solution210 {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        // 拓扑排序
        Map<Integer, List<Integer>> outGraph = new HashMap<>();
        int[] inDegrees = new int[numCourses];

        // 其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
        for (int[] prerequisite : prerequisites) {
            int from = prerequisite[1];
            int to = prerequisite[0];
            outGraph.computeIfAbsent(from, key -> new ArrayList<>()).add(to);
            inDegrees[to]++;
        }

        // 入度为 0 进队列。记为 0 到 numCourses - 1
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (inDegrees[i] == 0) {
                queue.add(i);
            }
        }
        List<Integer> resList = new ArrayList<>();
        while (!queue.isEmpty()) {
            int cur = queue.remove();
            resList.add(cur);

            for (int next : outGraph.getOrDefault(cur, new ArrayList<>())) {
                inDegrees[next]--;
                if (inDegrees[next] == 0) {
                    queue.add(next);
                }
            }
        }
        if (resList.size() == numCourses) {
            return resList.stream().mapToInt(i -> i).toArray();
        }
        return new int[]{};
    }
}

(全文完)