题解
-
题目:在选修某些课程之前需要一些先修课程。 例如,想要学习课程0,你需要先完成课程1。我们用一个匹配来表示他们: [1,0]。例子,给定一个数字代表课程总量,以及
n
对数据,前者代表要学课程, 后者代表基础课程,4, [[1,0],[2,0],[3,1],[3,2]]
。 -
题解:拓扑排序,很简单的想法,根据需求关系建立一个有序拓扑图,首先将入度为
0
的点找出来,然后将相邻节点的度数减1,如果相邻节点的度数为0了,就加入到队列中,循环这个过程,直到队列是空的。
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] degree = new int[numCourses];
Queue<Integer> q = new LinkedList<Integer>();
int n = prerequisites.length;
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < numCourses; i++)
list.add(new ArrayList<>());
for(int i = 0;i < n;i++){
degree[prerequisites[i][0]]++;
list.get(prerequisites[i][1]).add(prerequisites[i][0]);
}
for(int i = 0;i < numCourses;i++){
if(degree[i] == 0)
q.offer(i);
}
List<Integer> node = new ArrayList<>();
while(!q.isEmpty()){
int s = q.size();
for(int i = 0;i < s;i++)
{
int cur = q.poll();
node.add(cur);
List<Integer> nexts = list.get(cur);
for(int nei:nexts){
degree[nei]--;
if(degree[nei] == 0)
q.offer(nei);
}
}
}
if(node.size() < numCourses) return new int[0];
return node.stream().mapToInt(i -> i).toArray();
}
}