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:
- The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
- 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; } }