87 lines
3.2 KiB
Java
87 lines
3.2 KiB
Java
package graph;
|
||
|
||
import java.util.*;
|
||
|
||
/**
|
||
* 题目: 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/
|
||
|
||
*/
|
||
//二刷会做(先把207做了就会)
|
||
public class FindOrder {
|
||
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];
|
||
}
|
||
|
||
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];
|
||
}
|
||
}
|