Course Schedule
这题的本质就是,给你一个代表 graph 的 adjacency array,判断 graph 是否有环。其实和 Graph Valid Tree 非常像。
DFS 找环性能优异,DFS找环相当于在DFS的基础上(1)需要传一个visited数组,每次访问某个点的时候判断该点的visit数值,如果为0表示没有被访问过,1表示有环,2表示访问完成。再次访问1肯定有环。
(2)每次传一个cur参数,表明你现在正在遍历哪个点。
(2)加上一个boolean返回值的helper函数,当遇见环的时候直接返回。
(3)找环属于preorder。
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] graph = new ArrayList[numCourses];
int[] visited = new int[numCourses];
for(int i = 0; i < numCourses; i++){
graph[i] = new ArrayList<Integer>();
}
for(int[] num : prerequisites){
int parent = num[1];
int child = num[0];
graph[parent].add(child);
}
for(int i = 0; i < numCourses; i++){
if(visited[i] == 0 && hasCycle(i, visited, graph)) return false;
}
return true;
}
private boolean hasCycle(int cur, int[] visited, ArrayList[] graph){
visited[cur] = 1;
boolean hasCycle = false;
for(int i = 0; i < graph[cur].size(); i++){
int next = (int) graph[cur].get(i);
if(visited[next] == 1) return true;
else if(visited[next] == 0){
hasCycle = hasCycle || hasCycle(next, visited, graph);
}
}
visited[cur] = 2;
return hasCycle;
}
}
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] graph = new ArrayList[numCourses];
int[] visited = new int[numCourses];
for(int i = 0; i < numCourses; i++){
graph[i] = new ArrayList<Integer>();
}
for(int[] num : prerequisites){
int parent = num[1];
int child = num[0];
graph[parent].add(child);
}
for(int i = 0; i < numCourses; i++){
if(visited[i] == 0 && hasCycle(i, visited, graph)) return false;
}
return true;
}
private boolean hasCycle(int cur, int[] visited, ArrayList[] graph){
visited[cur] = 1;
boolean hasCycle = false;
for(int i = 0; i < graph[cur].size(); i++){
int next = (int) graph[cur].get(i);
if(visited[next] == 1) return true;
else if(visited[next] == 0){
hasCycle = hasCycle || hasCycle(next, visited, graph);
}
}
visited[cur] = 2;
return hasCycle;
}
}