Solution 1

  • TimeO(V + E)
  • SpaceO(V + E)

Where, V is number of courses, E is number of prerequisites.
We're only doing dfs for each course once, and checking each prerequisite link once, because we're using memoization.

Python
class Solution:
    '''
    Time Complexity: O(V + E)
    Space Complexity: O(V + E)
    Where, V is number of courses, E is number of prerequisites. 
    We're only doing dfs for each course once, and checking each prerequisite link once, because we're using memoization.
    '''
    def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
        courseDependencies = dict()
        possibleCourses = set()

        for course, dependency in prerequisites:
            courseDependencies.setdefault(course, set()).add(dependency)
            courseDependencies.setdefault(dependency, set())
        
        visited = set()

        def isCoursePossible(course):
            if course in visited:
                return False
            if course in possibleCourses:
                return True

            visited.add(course)
            
            for dependency in courseDependencies[course]:
                if not isCoursePossible(dependency):
                    return False
            
            visited.discard(course)
            possibleCourses.add(course)
            return True

        for course in courseDependencies:
            if not isCoursePossible(course):
                return False
        
        return True
Leet Code/python.py · L2546–2584