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中的字典和列表会使代码更好看。