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>graph=new ArrayList<>(); int[] res=new int[numCourses]; Queuequeue=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> graph = new ArrayList<>(); // 初始化图 for (int i = 0; i < numCourses; i++) { graph.add(new ArrayList<>()); } Queuequeue=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; Listtp=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]; } }