淘先锋技术网

首页 1 2 3 4 5 6 7

Problem: 210. 课程表 II

思路

首先这道题是一道经典的拓扑排序题目,那么什么是拓扑排序呢?举例说明:

请添加图片描述
在上图中,左边这个图我们首先一个一个点的去判断他们的入度是多少,从左到右就是 (0:0),(1:1),(2:1),(3:2),然后我们先找到入度为0的点接下来删除掉这个点以及他指出去的边,然后重复这个过程,一个一个输出那些入度为0的点,这个图最终的拓扑排序就是:0,1,2,3或者0,2,1,3这样,那么知道了拓扑排序再来看这道题就很简单了

解题方法

 for(int[] edges :prerequisites){
            inDegree[edges[0]]++;
        }
        Deque<Integer> q = new LinkedList();
        for(int i = 0;i<inDegree.length;i++){
            if(inDegree[i]==0){
                q.offer(i);
            }
        }
  int[] res = new int[numCourses];
        int index = 0;
        while(!q.isEmpty()){
            int node = q.poll();
            res[index++] = node;
            for(int[] edges : prerequisites){
                if(edges[1]==node){
                    inDegree[edges[0]]--;
                    if(inDegree[edges[0]]==0){
                        q.offer(edges[0]);
                    }
                }
            }

        }

复杂度

  • 时间复杂度:

添加时间复杂度, 示例: O ( n ) O(n) O(n)

  • 空间复杂度:

添加空间复杂度, 示例: O ( n ) O(n) O(n)

Code


class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        
        int[] inDegree = new int[numCourses];

        for(int[] edges :prerequisites){
            inDegree[edges[0]]++;
        }

        Deque<Integer> q = new LinkedList();
        for(int i = 0;i<inDegree.length;i++){
            if(inDegree[i]==0){
                q.offer(i);
            }
        }


        int[] res = new int[numCourses];
        int index = 0;
        while(!q.isEmpty()){
            int node = q.poll();
            res[index++] = node;
            for(int[] edges : prerequisites){
                if(edges[1]==node){
                    inDegree[edges[0]]--;
                    if(inDegree[edges[0]]==0){
                        q.offer(edges[0]);
                    }
                }
            }

        }

        return index == numCourses? res:new int[0];

    }
}