207. 课程表

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程  bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
 

提示:

1 <= numCourses <= 2000
0 <= prerequisites.length <= 5000
prerequisites[i].length == 2
0 <= ai, bi < numCourses
prerequisites[i] 中的所有课程对 互不相同

解题思路

  1. 用到拓扑排序的方式
  2. 前置结点是当前结点的父结点
  3. 先根据二维数组记录好每个结点对应的父结点,和每个结点的入度值用数组w记录
  4. 然后把w为0的结点入队,每个次出队都遍历该结点的子结点,为子结点的w值减一操作,这里减一是因为该课程的一个前置课程被完成了,当该课程没有前置课程时,该课程就可以开始完成
  5. 当队列为空时,表示已经没有出现w为0的结点了
  6. 此时比较出队了结点数即拓扑排序过程中“摘下”结点数与结点总数作比较相等说明已经学完所有课程,不相等说明存在前置课程无法完成的结点
static public boolean canFinish(int numCourses, int[][] prerequisites) {
        int w[]=new int[numCourses];
        Map>listMap=new HashMap>();
        for (int i = 0; i list=new ArrayList();
                list.add(y);
                listMap.put(x,list);
            }
        }
        Queuequeue=new LinkedList();
        for (int i = 0; i 

你可能感兴趣的:(Java基础,算法,java,算法,数据结构)