From c45b01a83876b7469d65034316c28ac7278765f1 Mon Sep 17 00:00:00 2001 From: Deven <63876261+devenperez@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:54:18 -0500 Subject: [PATCH] Time: 814 ms (5.02%), Space: 57 MB (17.32%) - LeetHub --- .../2050-parallel-courses-iii.py | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 2050-parallel-courses-iii/2050-parallel-courses-iii.py diff --git a/2050-parallel-courses-iii/2050-parallel-courses-iii.py b/2050-parallel-courses-iii/2050-parallel-courses-iii.py new file mode 100644 index 0000000..996f85b --- /dev/null +++ b/2050-parallel-courses-iii/2050-parallel-courses-iii.py @@ -0,0 +1,56 @@ +class Solution: + def minimumTime(self, n: int, relations: List[List[int]], time: List[int]) -> int: + """ + Complexities: + Time: O(n^2) + Space: O(r) + + where n = n, r = len(relations) + """ + + # courses been taken array + # - O(r) time / O(r) space + hasPrereq = [False] * n + prereqMap = [set() for i in range(n)] + leadsToMap = [set() for i in range(n)] + for prevCourse, nextCourse in relations: + hasPrereq[nextCourse - 1] = True + prereqMap[nextCourse - 1].add(prevCourse) + leadsToMap[prevCourse - 1].add(nextCourse) + + # O(n) space + timeUntilComplete = [-1] * n + coursesCalculated = 0 + maxOverallTimeFound = 0 + toResolve = set() + + # calculate timeUntilComplete for no prereq courses + # - O(n) time + for i in range(n): + if not hasPrereq[i]: + timeUntilComplete[i] = time[i] + maxOverallTimeFound = max(maxOverallTimeFound, time[i]) + coursesCalculated += 1 + toResolve.update(leadsToMap[i]) + + # find all timeUntilComplete + # - if all prereq times are known, then calc + # - O(n^2) time + while len(toResolve) > 0: + nextCourse = toResolve.pop() + maxPrereqTime = -1 + for prereq in prereqMap[nextCourse - 1]: + if timeUntilComplete[prereq - 1] == -1: + maxPrereqTime = -1 + break + maxPrereqTime = max(maxPrereqTime, timeUntilComplete[prereq - 1]) + + if maxPrereqTime > -1: + timeUntilComplete[nextCourse - 1] = maxPrereqTime + time[nextCourse - 1] + maxOverallTimeFound = max(maxOverallTimeFound, timeUntilComplete[nextCourse - 1]) + coursesCalculated += 1 + toResolve.update(leadsToMap[nextCourse - 1]) + + + + return maxOverallTimeFound \ No newline at end of file