总结:拓扑排序问题
根据依赖关系,构建邻接表、入度数组。
选取入度为 0 的数据,根据邻接表,减小依赖它的数据的入度。
找出入度变为 0 的数据,重复第 2 步。
直至所有数据的入度为 0,得到排序,如果还有数据的入度不为 0,说明图中存在环。
int[] inD = new int[numCourses]; \\入度
HashMap<Integer, List<Integer>> hashMap = new HashMap<>();
for(int i=0;i<prerequisites.length;i++){
inD[prerequisites[i][1]]++;
if(!hashMap.containsKey(prerequisites[i][0])){
List<Integer> list = new ArrayList<>();
list.add(prerequisites[i][1]);
hashMap.put(prerequisites[i][0],list);
}else{
List<Integer> list = hashMap.get(prerequisites[i][0]);
list.add(prerequisites[i][1]);
}
}
HashSet<Integer> hashSet = new HashSet<>();
Queue<Integer> queue = new LinkedList<>();
for(int i=0;i<numCourses;i++){
if(inD[i] == 0){
queue.add(i);
}
}
while(!queue.isEmpty()){
Integer inNum = queue.poll();
hashSet.add(inNum);
List<Integer> list = hashMap.get(inNum);
if(list!=null){
for(Integer i : list){
inD[i]--;
if(inD[i] == 0){
queue.add(i);
}
}
}
}
return hashSet.size() == numCourses ? true : false;