48.Course Schedule(课程安排)

Level:

  Medium

题目描述:

There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]] 
Output: true
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take. 
             To take course 1 you should have finished course 0, and to take course 0 you should
             also have finished course 1. So it is impossible.

Note:

  1. The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  2. You may assume that there are no duplicate edges in the input prerequisites.
思路分析:

  这题是拓扑排序一道应用,首先,我们应该统计每个点的入度,然后根据拓扑排序的规则,先删去入度为0的点,直到最后点的个数为0,则是正确的排课。

代码:
public class Solution{
    public boolean canFinish(int coursenum,int[][]prerequisites){
        int []indegree=new int [coursenum];//记录每门课的入度。
        for(int []pair:prerequisites){
            indegree[pair[0]]++; //统计每门课的入度
        }
        Queue<Integer>q=new LinkedList<>(); //存放入度为0的课程,准备删除
        for(int i=0;i<coursenum;i++){
            if(indegree[i]==0)
                q.offer(i);
        }
        while(!q.isEmpty()){
            int key=q.poll();//删除一个入度为0的课程
            coursenum--;//课程数减1
            for(int[] pair:prerequisites){
                if(pair[1]==key){//因为删除了节点,那么和这个节点相连的节点入度减一。
                    indegree[pair[0]]--;
                if(indegree[pair[0]]==0)//如果减一后,这个节点的入度为0,则加入删除队列
                    q.offer(pair[0]);
                } 
            }
        }
        return coursenum==0; //如果最终都被删除,则满足排课顺序
    }
}

转载于:https://www.cnblogs.com/yjxyy/p/11087403.html

courseschedule代表整个课程注册系统,而类course则代表具体的课程。 在类courseschedule中,我们可以定义一些属性和方法来管理和操作课程信息。比如: 1. 属性: - courses:一个列表,用来储存所有已注册的课程对象。 2. 方法: - add_course(course):将一个课程对象添加到courses列表中。 - remove_course(course):从courses列表中移除一个课程对象。 - search_course(course_name):根据课程名称搜索并返回对应的课程对象。 - get_all_courses():返回courses列表中的所有课程对象。 - count_courses():返回已注册的课程数量。 - check_conflict(course):检查某个课程对象是否与已注册的课程时间冲突。 - generate_schedule():根据已注册的课程生成课程表。 在类course中,我们可以定义一些属性和方法来描述和管理课程的具体信息。比如: 1. 属性: - course_name:课程名称。 - course_code:课程代码。 - instructor:授课教师。 - schedule课程时间安排。 2. 方法: - get_course_name():返回课程名称。 - get_course_code():返回课程代码。 - get_instructor():返回授课教师。 - get_schedule():返回课程时间安排。 通过两个类的定义和相应的方法,我们可以在课程注册系统中实现课程的注册、查询、删除、时间冲突检查和生成课程表等功能。这样可以方便学生和教师管理自己的课程信息,并避免时间冲突的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值