是207课程表的变种,在207基础上,dfs的时候将课程添加到list即可。
在dfs搜索里面,被依赖的课程总是先加到list里面,如果一次搜索中有课程未添加进去,说明与当前这些课程不依赖,因此后面再加进去也符合条件
public int[] findOrder(int numCourses, int[][] prerequisites) {
if (numCourses < 1) {
return new int[0];
}
List<Integer> list = new ArrayList<>();
List<List<Integer>> A = new ArrayList<>();
for (int i = 0; i < numCourses; i++) {
A.add(new ArrayList<>());
}
for (int i = 0; i < prerequisites.length; i++) {
A.get(prerequisites[i][0]).add(prerequisites[i][1]);
}
int[] mark = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
if (!A.get(i).isEmpty()) {
if (cycle(i, mark, A,list)) {
return new int[0];
}
}
}
for (int i = 0; i < numCourses; i++) {
if (mark[i] == 0) {
list.add(i);
}
}
return list.stream().mapToInt(i->i).toArray();
}
boolean cycle(int curNum, int[] mark, List<List<Integer>> A, List<Integer> res) {
if (mark[curNum] == 1) {
return true;
}else if(mark[curNum] == 2){
return false;
}
mark[curNum] = 1;
for (Integer i : A.get(curNum)) {
if (cycle(i, mark, A,res)) {
return true;
}
}
res.add(curNum);
//标记为2,表示是安全的点,下次遇到直接返回false就可以
mark[curNum] = 2;
return false;
}