https://leetcode-cn.com/problems/course-schedule/
看官方思路太费劲了,不看了,把思路放在代码里讲
看完题目就感觉,这不就跟玩只狼一样嘛,打完这个boss才能解锁下面的剧情,和boss。(表示只狼真不是人玩的!T_T)
咳嗯!但是想要解锁新剧情,可能需要打多个boss。
所以第一种解法就肯定是按照这个思路来解的,一开始想用递归,后来发现递归太麻烦,不太行。遇到了几个坑,也算是基础不扎实的后果
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
p=[0]*numCourses#下标对应这个课程序号,下标的值则是要打完多少个boss才能解锁这个boss
q=[[]for i in range(numCourses)]
#下标对应课程序号,每个列表对应着只有学完下标课程才可以学列表中的课程序号,
#注意!我一开始用的是[[]]*numCourses,结果发现这样的列表中每个子列表的元
#素都是一样的,也就是相互影响,也就是说修改其中一个子列表就相当于对所有子列
#表进行了修改,但我不知道为什么p就可以这么写而且互不影响,有大佬知道的话欢迎留言
for i in prerequisites:
q[i[1]].append(i[0])
p[i[0]]+=1
#这个for循环的目的是往里头输入值
while 0 in p:
for i in range(numCourses):
if p[i]==0:
for j in q[i]:
p[j]-=1
p[i]=-1
#当p中有0时,就说明这个boss解锁了,然后打boss,打完了,继续看能不能解锁新boss,然后继续打,然后无限循环~~
for i in p:
if int(i)>0:
return False
return True
#完事儿!检索p中有没有大于0的课程,没有就是通关了,有就说明这游戏确实不是人玩的,有些boss你就是打不过(比如破戒僧)
方法二是逆向结题,看这里面有没有根本学不了的课,有就直接毙了。应该会快很多。明早再写,啊不,今早再写…