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.
题目大意:
其实就是判断一个有向图中是否存在环,可以使用BFS和DFS做,BFS的效率比DFS要高一些
解法:
java:
BFS解法:
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//记录有向图图节点之间的关系
ArrayList[] graph=new ArrayList[numCourses];
//记录每个节点的入度
int[] degree=new int[numCourses];
Queue queue=new LinkedList();
int count=0;
for (int i=0;i<numCourses;i++) graph[i]=new ArrayList();
for (int i=0;i<prerequisites.length;i++){
degree[prerequisites[i][1]]++;
graph[prerequisites[i][0]].add(prerequisites[i][1]);
}
for (int i=0;i<numCourses;i++){
if(degree[i]==0){
((LinkedList) queue).add(i);
count++;
}
}
while (!queue.isEmpty()){
int course=(int)((LinkedList) queue).pollFirst();
for (int i=0;i<graph[course].size();i++){
int index=(int)graph[course].get(i);
degree[index]--;
if (degree[index]==0){
((LinkedList) queue).add(index);
count++;
}
}
}
if(count==numCourses) return true;
else return false;
}
}
DFS解法;
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//记录有向图图节点之间的关系
ArrayList[] graph=new ArrayList[numCourses];
//记录每个节点是否被访问过
boolean[] visited=new boolean[numCourses];
for (int i=0;i<numCourses;i++) graph[i]=new ArrayList();
for (int i=0;i<prerequisites.length;i++){
graph[prerequisites[i][0]].add(prerequisites[i][1]);
}
for (int i=0;i<numCourses;i++){
if (!dfs(graph,visited,i)) return false;
}
return true;
}
private boolean dfs(ArrayList[] graph, boolean[] visited, int course){
if(visited[course])
return false;
else
visited[course] = true;;
for(int i=0; i<graph[course].size();i++){
if(!dfs(graph,visited,(int)graph[course].get(i)))
return false;
}
visited[course] = false;
return true;
}
}