【leetcode】207(Meduim)Course Schedule

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

就是图的拓扑排序

将所有的课程看成一张图。图中的点是每个课程。
每个节点有自己的前驱节点和后继节点,前驱节点就是如果我要上这个课我必须先提前修完的课,后继节点就是如果我修完当前节点就可以修后继节点的课。
然后每次上课选入度为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;
	}
	
}
运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值