Algorithm/src/main/java/graph/FindOrder.java

87 lines
3.2 KiB
Java
Raw Normal View History

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];
}
}