作者:独艺无二的爱 | 来源:互联网 | 2023-10-11 17:55
输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。有想到用图,图还没细看过,正好看看。拓扑排序思路一步步形成,类BFSclassSolution{publ
输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
有想到用图,图还没细看过,正好看看。
拓扑排序思路一步步形成,类BFS
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] inDegree = new int[numCourses];
HashMap> map = new HashMap<>();
Queue queue = new LinkedList<>();
for (int i = 0; i ) {
inDegree[prerequisites[i][0]]++;
if(map.containsKey(prerequisites[i][1])){
map.get(prerequisites[i][1]).add(prerequisites[i][0]);
} else {
List list = new ArrayList<>();
list.add(prerequisites[i][0]);
map.put(prerequisites[i][1], list);
}
}
//遍历,将index入队
List res = new ArrayList<>();
for (int i = 0; i ) {
if(inDegree[i] == 0){
queue.offer(i);
}
}
// 出队,查哈希表,将入度为零的入队
while (!queue.isEmpty()){
Integer cur = queue.poll();
res.add(cur);
if(map.containsKey(cur) && map.get(cur).size() != 0){
for (Integer num : map.get(cur)) {
inDegree[num]--;
if(inDegree[num] == 0) queue.offer(num);
}
}
}
//使用list的流来转为int[]数组,也可以通过遍历一遍完成转换。
return res.size() == numCourses ? res.stream().mapToInt(Integer::valueOf).toArray() : new int[0];
}
}