建立一个哈希表存储所有的节点和其相对应的父节点
DFS 遍历每个节点,将其加入答案数组中
遍历的过程要考虑是否有环,建立一个集合记录已经遍历过的点,如果在搜索的过程中遇到了在该集合中的节点,就是遇到了环,应返回给主函数环信息。
自己的(28ms)
class Solution {
List<Integer> ans = new ArrayList<>();
boolean[] re;
Map<Integer,List<Integer>> map = new HashMap<>();
boolean build(int i,List<Integer> r){
if(r.contains(i)){
return false;
}
if(ans.contains(i))
return true;
if(!map.containsKey(i)){
ans.add(i);
return true;
}
r.add(i);
List<Integer> l = map.get(i);
for(int k:l)
if(!build(k,new ArrayList<>(r)))
return false;
ans.add(i);
return true;
}
public int[] findOrder(int numCourses, int[][] prerequisites) {
re = new boolean[numCourses];
int[] fa = new int[numCourses];
for(int[] i:prerequisites){
map.put(i[0],map.getOrDefault(i[0],new ArrayList<Integer>()));
map.get(i[0]).add(i[1]);
fa[i[1]] = 1;
}
for(int i = 0; i < numCourses; i++){
if(fa[i] == 0){
if(!build(i,new ArrayList<>()))
return new int[0];
}
}
if(ans.size() < numCourses)
return new int[0];
return ans.stream().mapToInt(Integer::valueOf).toArray();
}
}