lc 210
把課程關係轉成有向圖,對圖進行深度優先遍歷,checked標記已經訪問過的節點,order保存訪問順序
也用到了回溯算法:
class Solution:
# checked 數組保存已經保存過的節點, visited記錄當前訪問過的節點, checked記錄訪問過的不會產生環的節點
# order保存訪問順序,v當前訪問節點
def has_cycle(self,graph,visited,checked,v,path):
if visited[v]: # 當前過程已經訪問過
return True
visited[v] = True
for i in graph[v]:
if not checked[i] and self.has_cycle(graph,visited,checked,i,path):
return True
checked[v] = True
visited[v] = False
path.append(v)
return False
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
if not prerequisites or len(prerequisites) == 0 or numCourses <=1:
retur n [i for i in range(numCourses)]
graph = []
visited = []
checked = []
path = []
for i in range(numCourses):
graph.append([])
checked.append(False)
visited.append(False)
for item in prerequisites:
graph[item[1]].append(item[0])
for i in range(numCourses):
if not checked[i] and self.has_cycle(graph,visited,checked,i,path):
return []
path.reverse()
return path
lc 207
class Solution:
def has_cycle(self,graph,visited,checked,v):
if visited[v]:
return True
visited[v] = True
for i in graph[v]:
if not checked[i] and self.has_cycle(graph,visited,checked,i):
return True
checked[v] = True
visited[v] = False
return False
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
if not prerequisites or len(prerequisites) == 0 or numCourses<=1:
return True
graph = []
visited = []
checked = []
for i in range(numCourses):
graph.append([])
checked.append(False)
visited.append(False)
for item in prerequisites:
graph[item[1]].append(item[0])
for i in range(numCourses):
if not checked[i] and self.has_cycle(graph,visited,checked,i):
return False
return True