解题思路

就是图的拓扑排序

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

运行结果

【leetcode】207(Meduim)Course Schedule

相关文章: