菜鸟成长日记
看了官方的题解,决定用广度优先搜索自己写一下
207题和210题算法一样,就是返回值不同
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
def in_list(num=0, array=None):
# 本想用dic的,结果获取items时提示是元组不能修改。。。还是用list吧,反正也差不多,正好课程编号是从0到n-1
# 将原list转换成需要的list形式[[0课程的先修课程1,0课程的先修课程2...],...]
l = [[] for _ in range(num)]
for item in array:
l[item[0]].append(item[1])
return l
def end_study(l=None):
# 是否全部学习完成
for i in range(len(l)):
if l[i] is not None: # 有一个不是None,则还有继续学习的可能
return False
return True
def continue_study(l=None):
# 是否能继续学习(存在[])
if [] in l:
return True
else:
return False
inNum_list = in_list(numCourses, prerequisites)
order = []
while True: # 每次循坏表示一轮学习
studyed = []
if end_study(inNum_list):
return order # 210题的返回值
# return True # 207题的返回值
if not continue_study(inNum_list):
return [] # 210题的返回值
# return False # 207题的返回值
for i in range(len(inNum_list)):
if inNum_list[i]==[]:
order.append(i)
studyed.append(i)
inNum_list[i] = None
if studyed!=[]:
for i in range(len(inNum_list)):
if inNum_list[i]:
for j in range(len(studyed)):
if studyed[j] in inNum_list[i]:
inNum_list[i].remove(studyed[j])
运行结果: 时间-1272 ms;内存-14.4 MB(207题:1116 ms;14.4 MB)
真的是辣鸡。。。可能像官方题解那样用collections会快点吧。。。