clllll  

image

import java.util.ArrayList;
import java.util.Deque;

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        // 思路: 入度为0的点入队。依次出队的时候。遍历当前点的指向。入度减1,
        // 如果入度为0.进队。
        // 队列为空了。但是还有点没有入队。那么就是有环。

        int[] cnt = new int[numCourses]; // 保存每个点的入度。

        // 邻接表实现图
        ArrayList<ArrayList<Integer>> graph = new ArrayList<>();

        for (int i = 0; i < cnt.length; i++) {
            graph.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            int from = prerequisites[i][1];
            int to = prerequisites[i][0];
            graph.get(from).add(to);
            cnt[to]++; // 入度+1
        }

        int[] queue = new int[numCourses]; // 队列
        int l = 0;
        int r = 0;

        // 入度为0的先进队列
        for (int i = 0; i < numCourses; i++) {
            if (cnt[i] == 0) {
                queue[r++] = i;
            }
        }
        int[] ans = new int[numCourses];
        int a = 0;
        // 依次出队
        while (l != r) {
            int cur = queue[l++]; // 出队
            ans[a++] = cur; // 收集答案
            for (int next : graph.get(cur)) {
                cnt[next]--; // 入度减一
                if (cnt[next] == 0) {
                    // 入度为0.可以进队
                    queue[r++] = next;
                }
            }

        }
        if (a == numCourses) {
            return ans;
        }
        return new int[] {};
    }
}
posted on 2024-12-11 21:47  llcl  阅读(5)  评论(0编辑  收藏  举报