leetcode-27双周赛-5410-课程表Ⅳ
题目描述:
提交:超时
class Solution: def checkIfPrerequisite(self, n: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]: dic = collections.defaultdict(set) for i,j in prerequisites: dic[i].add(j) ans = [] def helper(i,j): if j in dic[i]: return True elif len(dic[i]) == 0: return False for x in dic[i]: if helper(x, j): return True return False for i,j in queries: if helper(i,j): ans.append(True) else: ans.append(False) return ans
方法一:动态规划:O(N3)
class Solution: def checkIfPrerequisite(self, n, prerequisites, queries): admat = [] for i in range(n): admat.append([False]*n) for u, v in prerequisites: admat[u][v] = True for k in range(n): for i in range(n): for j in range(n): admat[i][j] = admat[i][j] or (admat[i][k] and admat[k][j]) return [admat[u][v] for u,v in queries]
方法二:搜索
class Solution: def checkIfPrerequisite(self, n: int, prerequisites: List[List[int]], queries: List[List[int]]) -> List[bool]: graph = [[] for _ in range(n)] for u, v in prerequisites: # need u to do v graph[u].append(v) ans = [] for qs, qt in queries: stack = [qs] seen = {qs} while stack: node = stack.pop() if node == qt: ans.append(True) break for nei in graph[node]: if nei not in seen: stack.append(nei) seen.add(nei) else: ans.append(False) return ans