Algorithm/src/main/java/graph/FindOrder.java
2025-07-05 18:04:10 +08:00

87 lines
3.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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