题目链接 思路 大一就做过的经典拓扑排序的题目~关于拓扑排序有两点应该注意的。首先是图的建立。一般是用邻接表表示,对应着Map。与此同时在建立图的过程中找到每个结点的入度值,可以用数组也可以用Map。还有就是在建立图之前要先在Map中创建对应的结点然后是拓扑排序的过程,拓扑排序我们是使用BFS来完成的,首先建一个队,然后把所有入度为0的结点放入。后续就不断取出队列的元素,然后利用邻接表更新入度表,遇到入度为0的结点就再次入队,直至队空 class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { Map<Integer,List<Integer>> graph = new HashMap<>(); int[] inDegrees = new int[numCourses]; // 保证所有结点都在map中 for(int i = 0 ; i < numCourses ; i++) graph.put(i,new ArrayList<>()); // 根据序列构建图 for(int[] pre : prerequisites){ graph.get(pre[1]).add(pre[0]); inDegrees[pre[0]]++; } // BFS Queue<Integer> queue = new LinkedList<>(); // 把所有入度为0的节点入队 for(int i = 0 ; i < numCourses ; i++){ if(0 == inDegrees[i]) queue.offer(i); } List<Integer> result = new ArrayList<>(); while(!queue.isEmpty()){ int index = queue.poll(); result.add(index); for(int i : graph.get(index)){ if(0 == --inDegrees[i]) queue.offer(i); } } return result.size() == numCourses ? result.stream().mapToInt(e->e).toArray() :new int[0]; } }