leetcode中等210课程表2 / 207课程表

Posted qq_40707462

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等210课程表2 / 207课程表相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
思路:拓朴排序/贪心算法/BFS
在这里插入图片描述
在这里插入图片描述
步骤:
1、扫描入度数组,将入度为 0 的结点放入队列。

2、只要队列非空,就从队首取出入度为 0 的结点,将这个结点输出到结果集中,并且将这个结点的所有邻接结点(它指向的结点)的入度减 1,在减 1 以后,如果这个被减 1的结点的入度为 0 ,就继续入队。

3、当队列为空的时候,检查结果集中的顶点个数是否和课程数相等即可。

辅助数组:

  1. 邻接表:记录节点指向关系,想要学习课程 1 ,需要先完成课程 0,即
    0 ->1,原输入[1,0],邻接表[0,1],方便查询0指向了哪些节点
  2. 入度数组:记录节点被指向的个数,如果为0,表示无条件可以学习
class Solution:
    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
        
        clen=len(prerequisites)
        if clen==0:
            return [i for i in range(numCourses)]
        
         # 入度数组,一开始全部为 0
        in_degrees = [0 for _ in range(numCourses)]
        # 邻接表
        adj = [set() for _ in range(numCourses)]
        # 想要学习课程 1 ,需要先完成课程 0,0 -> 1
        # 原输入[1,0],邻接表[0,1]
        for second, first in prerequisites:
            in_degrees[second] += 1
            adj[first].add(second)

        # 首先遍历一遍,把所有入度为 0 的结点加入队列
        res = []
        queue = []
        for i in range(numCourses):
            if in_degrees[i] == 0:
                queue.append(i)
        
        # 把queue中的节点加入res,寻找他们指向的节点,入度减一,如果入度为0就加入queue
        while(queue):
            top=queue.pop()
            res.append(top)

            for i in adj[top]:
                in_degrees[i] -= 1#top指向的节点入度减一
                if in_degrees[i] == 0:
                    queue.append(i)

		#检查结果集中的顶点个数是否和课程数相等        
        if len(res) != numCourses:
            return []
        return res

207、课程表
值判断能否学完,不需要具体顺序,节省了res空间

class Solution:
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        clen=len(prerequisites)
        if clen==0:
            return True
        
        in_degrees = [0 for _ in range(numCourses)]
        adj = [set() for _ in range(numCourses)]
        for second, first in prerequisites:
            in_degrees[second] += 1
            adj[first].add(second)

        queue=[]
        queue = []
        for i in range(numCourses):
            if in_degrees[i] == 0:
                queue.append(i)
        
        while queue:
            numCourses-=1
            top=queue.pop(0)
            for i in adj[top]:
                in_degrees[i]-=1
                if in_degrees[i]==0:
                    queue.append(i)
        return numCourses==0

以上是关于leetcode中等210课程表2 / 207课程表的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 210. 课程表 II----拓扑排序篇二

LeetCode刷题模版:201 - 210

LeetCode刷题模版:201 - 210

LeetCode刷题模版:201 - 210

LeetCode207 课程表

[LeetCode] 207. 课程表(拓扑排序,BFS)