leetcode: Course Schedule

判断给出的课程先修条件是否可能满足所有课程全部修满.....实际上我们不妨先用一个二维矩阵记录所有课程的先修关系,用一个一维数组pre记录每门课的先修课程数量....

问题的突破口在于那些没有先修课程的课(否则肯定不合理,一门都修不了)。我们用一个队列queue存储可以修的课并用count记录能修的课程数,初始queue存储的是那些没有先修课的课程....遍历queue,对于其中的每一门课查找二维矩阵找到以这门课作为先修课的课程j,j的pre就应该减1,当pre[j]为0时说明j的先修课条件被全部满足,可以将j加入queue中.....最终比较count和课程数的关系即可.....


public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[][] rel=new int[numCourses][numCourses];
        int[] preNum=new int[numCourses];
        for( int i=0;i<prerequisites.length;i++ )
        {
            int curCourse=prerequisites[i][0];
            int pre=prerequisites[i][1];
            if( rel[pre][curCourse]==0 )
            {
                preNum[curCourse]++;
            }
            rel[pre][curCourse]=1;
        }
        int count=0;
        Queue<Integer> queue=new LinkedList<Integer>();
        for( int i=0;i<numCourses;i++ )
        {
            if( preNum[i]==0 )
            {
                queue.add(i);
            }
        }
        while( !queue.isEmpty() )
        {
            count++;
            int course=queue.peek();
            queue.remove();
            for( int i=0;i<numCourses;i++ )
            {
                if( rel[course][i]==1 )
                {
                    preNum[i]--;
                    if( preNum[i]==0 )
                    {
                        queue.add(i);
                    }
                }
            }
        }
        return count==numCourses;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值