210. 课程表 II

Problem: 210. 课程表 II

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一道拓扑排序的模板题目

解题方法

1、建图
2、统计入度, 进行bfs遍历完成拓扑排序

复杂度

时间复杂度:

时间复杂度为 O ( V + E ) O(V+E) O(V+E),其中V为课程数量,E为先修关系数量。

空间复杂度:

空间复杂度为 O ( V ) O(V) O(V),其中V为课程数量。

Code

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        List> graph = new ArrayList<>();
        //建图
        // 0 到 n - 1
        for(int i = 0; i < numCourses; i++) {
            graph.add(new ArrayList<>());
        } 
        // 入度表
        int[] indegree = new int[numCourses];
        for(int[] edge : prerequisites) {
            graph.get(edge[1]).add(edge[0]);
            indegree[edge[0]]++;
        }
        int[] queue = new int[numCourses];
        int l = 0, r = 0;
        for(int i = 0; i < numCourses; i++) {
            if(indegree[i] == 0) {
                queue[r++] = i;
            }
        }
        int cnt = 0;
        while(l < r) {
            int cur = queue[l++];
            cnt++;
            for(int next : graph.get(cur)) {
                if(--indegree[next] == 0) {
                    queue[r++] = next;
                }
            }
        }
        return cnt == numCourses ? queue : new int[0];
    }
}

你可能感兴趣的:(算法,bfs,图搜索,排序算法)