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 ,需要先完成课程 0,即
0 ->1
,原输入[1,0],邻接表[0,1],方便查询0指向了哪些节点 - 入度数组:记录节点被指向的个数,如果为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课程表的主要内容,如果未能解决你的问题,请参考以下文章