【8月打卡~Leetcode每日一题】207. 课程表(难度:中等)

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

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

给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?
在这里插入图片描述
思路:①建立两个哈希表,第一个用来存放某门课需要的先修课程数,第二个用来存放关系(某门课是哪些课程的先修课程)
②创建一个安全队列,将无需先修的课程放入
③维护这个安全队列,每次取出一个,根据第二个哈希表的关系,将对应的第一个哈希表的先修课程数减1(视为完成该先修课程),如果先修课程降为0,则将其加入安全队列
④根据哈希表判断是否还有课程未完成,如有则返回False,否则返回True

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        relation_num_dict = {}
        relation_dict = {}
        for relation in prerequisites:
            if relation[0] in relation_num_dict:
                relation_num_dict[relation[0]] += 1
            else:
                relation_num_dict[relation[0]] = 1
            if relation[1] in relation_dict:
                relation_dict[relation[1]].append(relation[0])
            else:
                relation_dict[relation[1]] = [relation[0]]

        safe_queue = []
        for num in range(numCourses):
            if(num not in relation_num_dict):
                safe_queue.append(num)
                
        while(safe_queue != []):
            safe_num = safe_queue.pop()
            if(safe_num in relation_dict):
                for num in relation_dict[safe_num]:
                    if(num in relation_num_dict):
                        relation_num_dict[num] -= 1
                        if(relation_num_dict[num] == 0):
                            safe_queue.append(num)
                            del relation_num_dict[num]
            
            
        for num in range(numCourses):
            if(num in relation_num_dict):
                return False
        return True

时间复杂度O(N+M)
空间复杂度O(N+M)
在这里插入图片描述
因为需要很多判断条件,如果使用collections中的字典和列表会使代码更好看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值