-
Notifications
You must be signed in to change notification settings - Fork 1
/
207.course-schedule.py
96 lines (87 loc) · 2.58 KB
/
207.course-schedule.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#
# @lc app=leetcode id=207 lang=python3
#
# [207] Course Schedule
#
# https://leetcode.com/problems/course-schedule/description/
#
# algorithms
# Medium (45.43%)
# Likes: 13497
# Dislikes: 542
# Total Accepted: 1.2M
# Total Submissions: 2.6M
# Testcase Example: '2\n[[1,0]]'
#
# There are a total of numCourses courses you have to take, labeled from 0 to
# numCourses - 1. You are given an array prerequisites where prerequisites[i] =
# [ai, bi] indicates that you must take course bi first if you want to take
# course ai.
#
#
# For example, the pair [0, 1], indicates that to take course 0 you have to
# first take course 1.
#
#
# Return true if you can finish all courses. Otherwise, return false.
#
#
# Example 1:
#
#
# Input: numCourses = 2, prerequisites = [[1,0]]
# Output: true
# Explanation: There are a total of 2 courses to take.
# To take course 1 you should have finished course 0. So it is possible.
#
#
# Example 2:
#
#
# Input: numCourses = 2, prerequisites = [[1,0],[0,1]]
# Output: false
# Explanation: There are a total of 2 courses to take.
# To take course 1 you should have finished course 0, and to take course 0 you
# should also have finished course 1. So it is impossible.
#
#
#
# Constraints:
#
#
# 1 <= numCourses <= 2000
# 0 <= prerequisites.length <= 5000
# prerequisites[i].length == 2
# 0 <= ai, bi < numCourses
# All the pairs prerequisites[i] are unique.
#
#
#
# @lc code=start
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
# define graph and indegree
graph = [[] for _ in range(numCourses)]
indegree = [0] * numCourses
# construct the graph
for a, b in prerequisites:
graph[b].append(a)
indegree[a] += 1
print(graph)
# BFS - queue will contain the courses that have no prerequisites
queue = []
for i in range(numCourses):
if indegree[i] == 0:
queue.append(i)
while queue:
# remove a course from queue
node = queue.pop(0)
# decrease indegree for next courses
for next_course in graph[node]:
indegree[next_course] -= 1
# if next course has no more prerequisites, add it to queue
if indegree[next_course] == 0:
queue.append(next_course)
# if all courses could be taken, return True
return not any(indegree)
# @lc code=end