解题思路
就是图的拓扑排序
将所有的课程看成一张图。图中的点是每个课程。
每个节点有自己的前驱节点和后继节点,前驱节点就是如果我要上这个课我必须先提前修完的课,后继节点就是如果我修完当前节点就可以修后继节点的课。
然后每次上课选入度为0的课(入度为0的课就是没有前驱节点的课,也就是可以直接上不需要先修完其他课程的课)
提交代码
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// create graphnodes
List<GraphNode> nodes=new ArrayList<>();
for(int i=0;i<numCourses;i++) {
GraphNode newNode=new GraphNode(i);
nodes.add(newNode);
}
// fill in the relations
for(int i=0;i<prerequisites.length;i++) {
nodes.get(prerequisites[i][0]).pre.add(prerequisites[i][1]);
nodes.get(prerequisites[i][1]).after.add(prerequisites[i][0]);
}
int curCourses=0;
boolean remain=false;
while(curCourses<numCourses) {
remain=false;
for(int i=0;i<nodes.size();i++) {
GraphNode curNode=nodes.get(i);
if(curNode.taken||curNode.pre.size()>0) continue;
curNode.taken=true;
remain=true;
curCourses++;
for(int j=0;j<curNode.after.size();j++)
nodes.get(curNode.after.get(j)).pre.remove((Integer)curNode.label);
}
if(!remain) return false;
}
return true;
}
}
class GraphNode{
int label;
boolean taken=false;
List<Integer> pre=new ArrayList<>();
List<Integer> after=new ArrayList<>();
public GraphNode(int label) {
this.label=label;
}
}
运行结果

本文介绍了一种使用图的拓扑排序算法解决课程先修条件问题的方法。通过将课程视为图的节点,建立课程间的依赖关系,采用拓扑排序找出合理的课程学习顺序,确保学生能够按部就班地完成所有课程的学习。

被折叠的 条评论
为什么被折叠?



