2025-05-20 11:03:47 +08:00
|
|
|
|
package graph;
|
|
|
|
|
|
2025-07-05 18:04:10 +08:00
|
|
|
|
import java.util.*;
|
2025-05-20 11:03:47 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 题目: 210. 课程表 II (findOrder)
|
|
|
|
|
* 描述:现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。
|
|
|
|
|
* 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
|
|
|
|
|
* 返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。
|
|
|
|
|
*
|
|
|
|
|
示例 1:
|
|
|
|
|
输入:numCourses = 2, prerequisites = [[1,0]]
|
|
|
|
|
输出:[0,1]
|
|
|
|
|
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。
|
|
|
|
|
|
|
|
|
|
* 链接:https://leetcode.cn/problems/course-schedule-ii/
|
|
|
|
|
|
|
|
|
|
*/
|
2025-07-05 18:04:10 +08:00
|
|
|
|
//二刷会做(先把207做了就会)
|
2025-05-20 11:03:47 +08:00
|
|
|
|
public class FindOrder {
|
2025-07-05 18:04:10 +08:00
|
|
|
|
public int[] findOrder2(int numCourses, int[][] prerequisites) {
|
|
|
|
|
int[] indgree=new int[numCourses];
|
|
|
|
|
List<List<Integer>>graph=new ArrayList<>();
|
|
|
|
|
int[] res=new int[numCourses];
|
|
|
|
|
Queue<Integer>queue=new LinkedList<>();
|
|
|
|
|
for (int i = 0; i < numCourses; i++) {
|
|
|
|
|
graph.add(new ArrayList<>());
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < prerequisites.length; i++) {
|
|
|
|
|
int course=prerequisites[i][0];
|
|
|
|
|
int precourse=prerequisites[i][1];
|
|
|
|
|
indgree[course]++;
|
|
|
|
|
graph.get(precourse).add(course);
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < numCourses; i++) {
|
|
|
|
|
if(indgree[i]==0)
|
|
|
|
|
queue.add(i);
|
|
|
|
|
}
|
|
|
|
|
int count=0;
|
|
|
|
|
while (!queue.isEmpty()){
|
|
|
|
|
int precourse=queue.poll();
|
|
|
|
|
res[count]=precourse;
|
|
|
|
|
count++;
|
|
|
|
|
for (Integer course : graph.get(precourse)) {
|
|
|
|
|
indgree[course]--;
|
|
|
|
|
if(indgree[course]==0)
|
|
|
|
|
queue.add(course);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(count==numCourses) return res;
|
|
|
|
|
else return new int[0];
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-20 11:03:47 +08:00
|
|
|
|
public int[] findOrder(int numCourses, int[][] prerequisites) {
|
|
|
|
|
int[] indegree=new int[numCourses];
|
|
|
|
|
int[] res=new int[numCourses];
|
|
|
|
|
int index=0;
|
|
|
|
|
// 构建图:graph.get(i) 存储课程 i 的后续课程
|
|
|
|
|
List<List<Integer>> graph = new ArrayList<>();
|
|
|
|
|
// 初始化图
|
|
|
|
|
for (int i = 0; i < numCourses; i++) {
|
|
|
|
|
graph.add(new ArrayList<>());
|
|
|
|
|
}
|
|
|
|
|
Queue<Integer>queue=new ArrayDeque<>();
|
|
|
|
|
for (int[] prerequisite : prerequisites) {
|
|
|
|
|
int course=prerequisite[0];
|
|
|
|
|
int precourse=prerequisite[1];
|
|
|
|
|
graph.get(precourse).add(course);
|
|
|
|
|
indegree[course]++;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < numCourses; i++) {
|
|
|
|
|
if(indegree[i]==0)queue.offer(i);
|
|
|
|
|
}
|
|
|
|
|
while (!queue.isEmpty()){
|
|
|
|
|
int cur=queue.poll();
|
|
|
|
|
res[index++]=cur;
|
|
|
|
|
List<Integer>tp=graph.get(cur);
|
|
|
|
|
for (Integer course : tp) {
|
|
|
|
|
indegree[course]--;
|
|
|
|
|
if(indegree[course]==0) queue.offer(course);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(index==numCourses)return res;
|
|
|
|
|
else return new int[0];
|
|
|
|
|
}
|
|
|
|
|
}
|