From 0009075138b03cac82211f7646f382fa6fa7b6e5 Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Tue, 22 Sep 2026 15:02:31 -0400 Subject: [PATCH] =?UTF-8?q?feat(work):=20implement=20Course=20Schedule?= =?UTF-8?q?=E2=80=AFII=20solution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../210-course-schedule-ii.mdx | 32 ++++++++++++ .../210.course-schedule-ii.py | 50 +++++++++++++++---- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/apps/docs/content/topological-sort/210-course-schedule-ii.mdx b/apps/docs/content/topological-sort/210-course-schedule-ii.mdx index c2a99f1..a5af8dd 100644 --- a/apps/docs/content/topological-sort/210-course-schedule-ii.mdx +++ b/apps/docs/content/topological-sort/210-course-schedule-ii.mdx @@ -36,4 +36,36 @@ sidebar: ```py class Solution: def findOrder(self, numCourses: int, prerequisites: list[list[int]]) -> list[int]: + prereq = {c: [] for c in range(numCourses)} + for crs, pre in prerequisites: + prereq[crs].append(pre) + + # course has 3 possible states: + # visited -> crs has been added to output + # visiting -> crs not added to output, but added to cycle + # unvisited -> crs not added to output nor cycle + output = [] + visit, cycle = set(), set() + + def dfs(crs): + if crs in cycle: + return False + if crs in visit: + return True + + cycle.add(crs) + for pre in prereq[crs]: + if dfs(pre) == False: + return False + + cycle.remove(crs) + visit.add(crs) + output.append(crs) + return True + + for c in range(numCourses): + if dfs(c) == False: + return [] + + return output ``` diff --git a/work/1/Medium/Depth-First Search/210.course-schedule-ii.py b/work/1/Medium/Depth-First Search/210.course-schedule-ii.py index fde7a6b..edbfef7 100644 --- a/work/1/Medium/Depth-First Search/210.course-schedule-ii.py +++ b/work/1/Medium/Depth-First Search/210.course-schedule-ii.py @@ -17,7 +17,7 @@ Return the ordering of courses you should take to finish all courses. If there are many valid answers, return any of them. If it is impossible to finish all courses, return an empty array. - + Example 1: @@ -42,23 +42,55 @@ Example 3: Input: numCourses = 1, prerequisites = [] Output: [0] - + Constraints: - • 1 <= numCourses <= 2000 + • 1 <= numCourses <= 2000 - • 0 <= prerequisites.length <= numCourses * (numCourses - 1) + • 0 <= prerequisites.length <= numCourses * (numCourses - 1) - • prerequisites[i].length == 2 + • prerequisites[i].length == 2 - • 0 <= ai, bi < numCourses + • 0 <= ai, bi < numCourses - • ai != bi + • ai != bi - • All the pairs [ai, bi] are distinct. + • All the pairs [ai, bi] are distinct. """ + class Solution: def findOrder(self, numCourses: int, prerequisites: list[list[int]]) -> list[int]: - + prereq = {c: [] for c in range(numCourses)} + for crs, pre in prerequisites: + prereq[crs].append(pre) + + # course has 3 possible states: + # visited -> crs has been added to output + # visiting -> crs not added to output, but added to cycle + # unvisited -> crs not added to output nor cycle + output = [] + visit, cycle = set(), set() + + def dfs(crs): + if crs in cycle: + return False + if crs in visit: + return True + + cycle.add(crs) + for pre in prereq[crs]: + if dfs(pre) == False: + return False + + cycle.remove(crs) + visit.add(crs) + output.append(crs) + return True + + for c in range(numCourses): + if dfs(c) == False: + return [] + + return output