判断给出的课程先修条件是否可能满足所有课程全部修满.....实际上我们不妨先用一个二维矩阵记录所有课程的先修关系,用一个一维数组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;
}
}
本文介绍了一种通过构建二维矩阵和使用队列的数据结构来解决课程修读顺序问题的方法。该算法能够判断在给定的课程先修条件下,学生是否有可能完成所有课程的学习。
1070

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



