207. Course Schedule
拓扑排序
先用一个数组indegree记录每个课程的入度,每次找一个入度为0的课程,把和该课程的边全部删掉,循环课程数次,如果找不到入度为0的点,则返回False,注意,当找到入度为0的点,需要更新,把它换成-1
class Solution(object):
def canFinish(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
indegree = [0] * numCourses
for pre in prerequisites:
indegree[pre[0]] += 1
for i in range(numCourses):
zero = -1
for i in range(numCourses):
if indegree[i] == 0:
zero = i
indegree[i] = -1
break
if zero == -1:
return False
for pre in prerequisites:
if pre[1] == zero:
indegree[pre[0]] -= 1
return True
210. Course Schedule II
仍然一样的思路,只是需要把路径用一个数组记录下来。
class Solution(object):
def findOrder(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: List[int]
"""
res = []
indegree = [0] * numCourses
for pre in prerequisites:
indegree[pre[0]] += 1
for i in range(numCourses):
zero = -1
for i in range(numCourses):
if indegree[i] == 0:
zero = i
indegree[i] = -1
break
if zero == -1:
return []
res.append(zero)
for pre in prerequisites:
if pre[1] == zero:
indegree[pre[0]] -= 1
return res