207. Course Schedule - Medium

There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]] 
Output: true
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0, and to take course 0 you should
             also have finished course 1. So it is impossible.

Note:

  1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  2. You may assume that there are no duplicate edges in the input prerequisites.

 

这道题其实是判断graph是否有环。用到了topological sort + BFS。

用二维数组graph表示图,一维数组indegree表示每个顶点的入度indegree, 还要用到一个queue,把所有indegree = 0的点放入队列中,然后开始遍历队列,从graph里遍历其连接的点,每到达一个新节点,其indegree减一,如果此时该点indegree = 0,放入队列。遍历完队列中所有的值,如果此时还有节点的indegree不为0,说明环存在,返回false,反之返回true。

时间:O(VE),空间:O(V)

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if(numCourses <= 0) return false;
        ArrayList[] graph = new ArrayList[numCourses];
        int[] indegree = new int[numCourses];
        
        for(int i = 0; i < numCourses; i++)
            graph[i] = new ArrayList();
        for(int[] pair : prerequisites) {
            graph[pair[1]].add(pair[0]);
            indegree[pair[0]]++;
        }
        
        Queue<Integer> q = new LinkedList<>();
        for(int i = 0; i < indegree.length; i++) {
            if(indegree[i] == 0)
                q.offer(i);
        }
        
        while(!q.isEmpty()) {
            int cur = q.poll();
            ArrayList tmp = graph[cur];
            for(int i = 0; i < tmp.size(); i++) {
                --indegree[(int)tmp.get(i)];
                if(indegree[(int)tmp.get(i)] == 0)
                    q.offer((int)tmp.get(i));
            }
        }
        
        for (int i = 0; i < numCourses; ++i) {
            if (indegree[i] != 0)
                return false;
        }
        return true;
    }
}

 

posted @ 2018-11-26 16:54  fatttcat  阅读(204)  评论(0编辑  收藏  举报