Leetcode 207. 课程表

题目要求:

现在你总共有 n 门课需要选,记为 0n-1

在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]

给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

示例:

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

算法:

  1. 构建:统计入度indegree,使用邻接表法构建有向图
  2. 借助一个deque,将所有indegree的点入队
  3. 当deque不为空时,将队首元素出队,并且对与其邻接的点的入度减一
    1. 如果邻接点的入度为0,将其入队
  4. 每次出队的时候,numcourses减一
    1. 如果numcourses == 0 说明课程表可以成功安排

实现:

class Solution(object):
    def canFinish(self, numCourses, prerequisites):
        """
        :type numCourses: int
        :type prerequisites: List[List[int]]
        :rtype: bool
        """
        indegree = [0 for _ in range(numCourses)]
        adj = [[] for _ in range(numCourses)]
        que = []
        for idx in prerequisites:
            cur = idx[0]
            pre = idx[1]
            indegree[cur] += 1
            adj[pre].append(cur)
            
        for i in range(len(indegree)):
            if not indegree[i]:
                que.append(i)
                
        while len(que) > 0:
            pre = que.pop()
            numCourses -= 1
            for course in adj[pre]:
                indegree[course] -= 1
                if not indegree[course]:
                    que.append(course)
        return not numCourses
        
posted @ 2019-10-23 17:23  Howardwang  阅读(118)  评论(0编辑  收藏  举报