这道题一开始没思路,但是感觉要使用dfs。看完解答之后,发现这是一个有向图问题,这类问题没有做过,这里记录一下。
如何用dfs来实现这个。
看一看示例2,可以发现,找到一个环,那就输出false,第二,明白在每一个课寻找完毕之后, 那么这些课就不会产生环;因为任何和环有关的节点一定会在第一时间找到。
如何记录就直接用一个flag数组,1表示走过,-1表示没有环
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < numCourses; i++) {
lists.add(new ArrayList<>());
}
for (int i = 0; i < prerequisites.length; i++) {
lists.get(prerequisites[i][1]).add(prerequisites[i][0]);
}
int[] flag = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
if (!dfs(prerequisites, lists,flag, i)) {
return false;
}
}
return true;
}
private boolean dfs(int[][] prerequisites, List<List<Integer>> lists, int[] flag, int i) {
if (flag[i] == -1) {
return true;
}
if (flag[i]==1) return false;
flag[i] = 1;
for (Integer j : lists.get(i)) {
if (!dfs(prerequisites,lists,flag,j)) return false;
}
flag[i] = -1;
return true;
}