leetcode-课程表(python)

题目:
现在你总共有 n 门课需要选,记为 0 到 n-1。

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

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

示例 1:

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

示例 2:

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

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        a ={} #建dict,key是需要先修的课,value是需要先修课的set
        for i in prerequisites:
            if i[0] not in a:
                a[i[0]] = {i[1]}
            else:
                a[i[0]].add(i[1])
        r = set() #记录可以修的课
        re = set() #记录还不可以修的课
        for i in range(numCourses):
            r.add(i)
            re.add(i)
        for i in a:
            r.remove(i)
        if len(r) == 0:
            return False
        for i in r:
            re.remove(i)
        while len(re) != 0:
            r1 = set()
            for i in a: &通过key访问value值
                if a[i]&r == a[i]: #已具备可以修的条件,&求交集
                    r1.add(i)
            if len(r1) == 0: #本轮没有能新学的课,说明剩下的课无法学习
                return False
            for i in r1:
                a.pop(i) #关键优化,避免重复
                re.remove(i) #还未修的减少了
                r.add(i) #可以修的增加了
        return True

你可能感兴趣的:(leetcode-课程表(python))