难度:Medium
题目:
现在你总共有
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] 。
示例 2:
输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] 输出:[0,2,1,3] 解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。 因此,一个正确的课程顺序是[0,1,2,3]
。另一个正确的排序是[0,2,1,3]
。
示例 3:
输入:numCourses = 1, prerequisites = [] 输出:[0]
提示:
1 <= numCourses <= 2000
0 <= prerequisites.length <= numCourses * (numCourses - 1)
prerequisites[i].length == 2
0 <= ai, bi < numCourses
ai != bi
- 所有
[ai, bi]
互不相同
Related Topics
- 深度优先搜索
- 广度优先搜索
- 图
- 拓扑排序
重点!!!解题思路
第一步:
明确解题手段:此题和LeetCode[207]差不多 解题手段几近相同
LeetCode[207]课程表
第二步:
此题与LeetCode[207]题不同的是,上一题是求能否可能完成学习,此题求的是完成题的顺序,在上一题中,我们本来就是按照学习顺序来判断能否完成的学习,所以此题就将上一题统计的学习顺序给统计起来即是答案。
源码+讲解:
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] indeg=new int[numCourses];
List<List<Integer>> g=new ArrayList<>();
for (int i=0;i<numCourses;i++){
g.add(new ArrayList<>());
}
for (int[] prerequisite : prerequisites) {
indeg[prerequisite[0]]++;
g.get(prerequisite[1]).add(prerequisite[0]);
}
Queue<Integer> queue=new ArrayDeque<>();
for (int i=0;i<indeg.length;i++){
if(indeg[i]==0) queue.offer(i);
}
//以上细致讲解请参考上一题
List<Integer> res=new ArrayList<>();
while (!queue.isEmpty()){
int pre = queue.poll();
res.add(pre); //统计出队顺序即是res
for (Integer cur : g.get(pre)) {
if (--indeg[cur]==0) queue.offer(cur);
}
}
if (res.size()-numCourses!=0) res.clear(); //应题目要求,无答案时返回空结果
return res.stream().mapToInt(i->i).toArray(); //集合转数组操作
}
}
运行结果:
如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。
系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧