From 4e2d1f3f035ae16ae65546b3dc03a0d336b9869c Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Mon, 22 Apr 2024 12:55:43 +0000 Subject: [PATCH 1/6] Add step1 --- .../python3/207/course-schedule.step1.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 problems/medium/python3/207/course-schedule.step1.py diff --git a/problems/medium/python3/207/course-schedule.step1.py b/problems/medium/python3/207/course-schedule.step1.py new file mode 100644 index 0000000..c877351 --- /dev/null +++ b/problems/medium/python3/207/course-schedule.step1.py @@ -0,0 +1,35 @@ +# +# @lc app=leetcode id=207 lang=python3 +# +# [207] Course Schedule +# + +# @lc code=start +class Solution: + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: + constraint_map, num_of_constraint_map = dict(), dict() + for after, before in prerequisites: + if before not in constraint_map: + constraint_map[before] = [] + constraint_map[before].append(after) + if after not in num_of_constraint_map: + num_of_constraint_map[after] = 0 + num_of_constraint_map[after] += 1 + + no_constraint_courses = [] + for i in range(numCourses): + if i not in num_of_constraint_map: + no_constraint_courses.append(i) + + taking_order = [] + while no_constraint_courses: + course = no_constraint_courses.pop() + taking_order.append(course) + if course not in constraint_map: + continue + for constraint in constraint_map[course]: + num_of_constraint_map[constraint] -= 1 + if num_of_constraint_map[constraint] == 0: + no_constraint_courses.append(constraint) + return len(taking_order) == numCourses +# @lc code=end From ecee2e1e8c4089ac47b494ff8597cd6eadf088a3 Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Mon, 22 Apr 2024 13:59:08 +0000 Subject: [PATCH 2/6] Add step2 --- .../python3/207/course-schedule.step2.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 problems/medium/python3/207/course-schedule.step2.py diff --git a/problems/medium/python3/207/course-schedule.step2.py b/problems/medium/python3/207/course-schedule.step2.py new file mode 100644 index 0000000..17bf8e7 --- /dev/null +++ b/problems/medium/python3/207/course-schedule.step2.py @@ -0,0 +1,31 @@ +# +# @lc app=leetcode id=207 lang=python3 +# +# [207] Course Schedule +# + +# @lc code=start +class Solution: + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: + postrequisites_of_courses = [[] for _ in range(numCourses)] + indegree_of_courses = [0 for _ in range(numCourses)] + + for course, prerequisite in prerequisites: + postrequisites_of_courses[prerequisite].append(course) + indegree_of_courses[course] += 1 + + non_indegree_courses = [] + for i in range(numCourses): + if indegree_of_courses[i] == 0: + non_indegree_courses.append(i) + + num_of_processed_courses = 0 + while non_indegree_courses: + nic = non_indegree_courses.pop() + for postrequisites in postrequisites_of_courses[nic]: + indegree_of_courses[postrequisites] -= 1 + if indegree_of_courses[postrequisites] == 0: + non_indegree_courses.append(postrequisites) + num_of_processed_courses += 1 + return num_of_processed_courses == numCourses +# @lc code=end From e6f0c5b7b749802a4d9581ffe5ae18d4c03b6edf Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Mon, 22 Apr 2024 15:43:22 +0000 Subject: [PATCH 3/6] Modify variable names --- .../python3/207/course-schedule.step2.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/problems/medium/python3/207/course-schedule.step2.py b/problems/medium/python3/207/course-schedule.step2.py index 17bf8e7..115a172 100644 --- a/problems/medium/python3/207/course-schedule.step2.py +++ b/problems/medium/python3/207/course-schedule.step2.py @@ -8,24 +8,24 @@ class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: postrequisites_of_courses = [[] for _ in range(numCourses)] - indegree_of_courses = [0 for _ in range(numCourses)] + num_prerequisites_of_courses = [0 for _ in range(numCourses)] for course, prerequisite in prerequisites: postrequisites_of_courses[prerequisite].append(course) - indegree_of_courses[course] += 1 + num_prerequisites_of_courses[course] += 1 - non_indegree_courses = [] + independent_courses = [] for i in range(numCourses): - if indegree_of_courses[i] == 0: - non_indegree_courses.append(i) + if num_prerequisites_of_courses[i] == 0: + independent_courses.append(i) num_of_processed_courses = 0 - while non_indegree_courses: - nic = non_indegree_courses.pop() - for postrequisites in postrequisites_of_courses[nic]: - indegree_of_courses[postrequisites] -= 1 - if indegree_of_courses[postrequisites] == 0: - non_indegree_courses.append(postrequisites) + while independent_courses: + ic = independent_courses.pop() + for postrequisites in postrequisites_of_courses[ic]: + num_prerequisites_of_courses[postrequisites] -= 1 + if num_prerequisites_of_courses[postrequisites] == 0: + independent_courses.append(postrequisites) num_of_processed_courses += 1 return num_of_processed_courses == numCourses # @lc code=end From 800a05546da55153e29386e2b0e28d57ead0545e Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Tue, 23 Apr 2024 14:24:53 +0000 Subject: [PATCH 4/6] Add step3 --- .../python3/207/course-schedule.step3.py | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 problems/medium/python3/207/course-schedule.step3.py diff --git a/problems/medium/python3/207/course-schedule.step3.py b/problems/medium/python3/207/course-schedule.step3.py new file mode 100644 index 0000000..8466226 --- /dev/null +++ b/problems/medium/python3/207/course-schedule.step3.py @@ -0,0 +1,32 @@ +# +# @lc app=leetcode id=207 lang=python3 +# +# [207] Course Schedule +# + +# @lc code=start +class Solution: + def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: + postrequisites_of_courses = [[] for _ in range(numCourses)] + num_prerequisites_of_courses = [0 for _ in range(numCourses)] + + for course, pre in prerequisites: + postrequisites_of_courses[pre].append(course) + num_prerequisites_of_courses[course] += 1 + + visited = set() + for i in range(numCourses): + if num_prerequisites_of_courses[i] == 0: + self.reducePrereqisite(postrequisites_of_courses, num_prerequisites_of_courses, visited, i) + return not any(num_prerequisites_of_courses) + + def reducePrereqisite(self, postrequisites_of_courses: List[List[int]], num_prerequisites_of_courses: List[int], visited: Set[int], course: int): + if course in visited: + return + visited.add(course) + for post in postrequisites_of_courses[course]: + num_prerequisites_of_courses[post] -= 1 + if num_prerequisites_of_courses[post] == 0: + self.reducePrereqisite(postrequisites_of_courses, num_prerequisites_of_courses, visited, post) + +# @lc code=end From b52ec72be15d143c4eabea6fe21bbf318412e8ab Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Tue, 23 Apr 2024 15:30:29 +0000 Subject: [PATCH 5/6] Mofify step3 to use recursive DFS --- .../python3/207/course-schedule.step3.py | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/problems/medium/python3/207/course-schedule.step3.py b/problems/medium/python3/207/course-schedule.step3.py index 8466226..4c04499 100644 --- a/problems/medium/python3/207/course-schedule.step3.py +++ b/problems/medium/python3/207/course-schedule.step3.py @@ -8,25 +8,25 @@ class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: postrequisites_of_courses = [[] for _ in range(numCourses)] - num_prerequisites_of_courses = [0 for _ in range(numCourses)] + for course, prerequisite in prerequisites: + postrequisites_of_courses[prerequisite].append(course) - for course, pre in prerequisites: - postrequisites_of_courses[pre].append(course) - num_prerequisites_of_courses[course] += 1 - - visited = set() - for i in range(numCourses): - if num_prerequisites_of_courses[i] == 0: - self.reducePrereqisite(postrequisites_of_courses, num_prerequisites_of_courses, visited, i) - return not any(num_prerequisites_of_courses) - - def reducePrereqisite(self, postrequisites_of_courses: List[List[int]], num_prerequisites_of_courses: List[int], visited: Set[int], course: int): - if course in visited: - return - visited.add(course) - for post in postrequisites_of_courses[course]: - num_prerequisites_of_courses[post] -= 1 - if num_prerequisites_of_courses[post] == 0: - self.reducePrereqisite(postrequisites_of_courses, num_prerequisites_of_courses, visited, post) + NOT_CHECKED, CHECKING, COMPLETED = 0, 1, 2 + def hasCycle(labels: List[int], course: int) -> bool: + if labels[course] == CHECKING: + return True + if labels[course] == COMPLETED: + return False + labels[course] = CHECKING + for post in postrequisites_of_courses[course]: + if hasCycle(labels, post): + return True + labels[course] = COMPLETED + return False + labels = [NOT_CHECKED for _ in range(numCourses)] + for course in range(numCourses): + if hasCycle(labels, course): + return False + return True # @lc code=end From f1c611f96bb6201b9270d037eafddb3a136d818d Mon Sep 17 00:00:00 2001 From: Tomoya Honda Date: Wed, 24 Apr 2024 10:15:35 +0000 Subject: [PATCH 6/6] Add title to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f6756a2..42f7867 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ LeetCode の問題を以下手順で解く | # | Title | Language | Difficulty | | --- | ----------------------------------------------------------------------------------------------------- | -------- | ---------- | +| 207 | [Course Schedule](https://leetcode.com/problems/course-schedule/description/) | Python3 | Medium | | 322 | [Coin Change](https://leetcode.com/problems/coin-change/description/) | Python3 | Medium | | 417 | [Pacific Atlantic Water Flow](https://leetcode.com/problems/pacific-atlantic-water-flow/description/) | Python3 | Medium |