拓扑排序
https://leetcode-cn.com/problems/QA2IGt/
题目:
先利用HashMap存储课程和后续课程构成邻接表;
记录每门课的入度;
用队列实现广度优先搜索;
先挑选入度为0的节点,并保存至队列中;
每次从队列中取出入度为0的节点,并将其对应的LinkedList中的节点入度减1,发现入度为0的节点时添加到队列中,直到队列为空;
最后判断order长度是否等于numCourses,相等表明是有向无环图,返回该结果;否则,返回空。
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
//建立邻接表
HashMap<Integer, LinkedList<Integer>> graph = new HashMap<>();
int[] inDegree = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
graph.put(i, new LinkedList<Integer>());
}
//添加每个节点对应后续节点,并记录每个节点入度
for (int[] prerequisite : prerequisites) {
graph.get(prerequisite[1]).add(prerequisite[0]);
inDegree[prerequisite[0]]++;
}
//查找入度为0的节点
List<Integer> order = new LinkedList<>();
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
if(inDegree[i] == 0){
queue.offer(i);
}
}
while(!queue.isEmpty()){
int course = queue.poll();
order.add(course);
for (Integer c : graph.get(course)) {
inDegree[c]--;
if(inDegree[c] == 0){
queue.offer(c);
}
}
}
if(order.size() != numCourses){
return new int[0];
}
int[] res = new int[numCourses];
for (int i = 0; i < order.size(); i++) {
res[i] = order.get(i);
}
return res;
}
}