Skip to content

Commit 6de00bb

Browse files
authored
Update course-schedule-ii.py
1 parent daff178 commit 6de00bb

File tree

1 file changed

+50
-27
lines changed

1 file changed

+50
-27
lines changed

Python/course-schedule-ii.py

+50-27
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,60 @@
1-
from collections import defaultdict, deque
1+
# Time: O(|V| + |E|)
2+
# Space: O(|E|)
23

4+
import collections
35

6+
7+
# bfs solution
48
class Solution(object):
59
def findOrder(self, numCourses, prerequisites):
610
"""
711
:type numCourses: int
812
:type prerequisites: List[List[int]]
913
:rtype: List[int]
1014
"""
11-
res, zero_in_degree_queue = [], deque()
12-
in_degree, out_degree = defaultdict(set), defaultdict(set)
13-
15+
indegree = collections.defaultdict(set)
16+
outdegree = collections.defaultdict(set)
1417
for i, j in prerequisites:
15-
in_degree[i].add(j)
16-
out_degree[j].add(i)
17-
18-
for i in xrange(numCourses):
19-
if i not in in_degree:
20-
zero_in_degree_queue.append(i)
21-
22-
while zero_in_degree_queue:
23-
prerequisite = zero_in_degree_queue.popleft()
24-
res.append(prerequisite)
25-
26-
if prerequisite in out_degree:
27-
for course in out_degree[prerequisite]:
28-
in_degree[course].discard(prerequisite)
29-
if not in_degree[course]:
30-
zero_in_degree_queue.append(course)
31-
32-
del out_degree[prerequisite]
33-
34-
if out_degree:
35-
return []
36-
37-
return res
18+
indegree[i].add(j)
19+
outdegree[j].add(i)
20+
q = collections.deque([i for i in xrange(numCourses) if i not in indegree])
21+
result = []
22+
while q:
23+
node = q.popleft()
24+
result.append(node)
25+
for i in outdegree[node]:
26+
indegree[i].remove(node)
27+
if not indegree[i]:
28+
q.append(i)
29+
del indegree[i]
30+
del outdegree[node]
31+
return result if not indegree and not outdegree else []
32+
33+
34+
# Time: O(|V| + |E|)
35+
# Space: O(|E|)
36+
# dfs solution
37+
class Solution2(object):
38+
def findOrder(self, numCourses, prerequisites):
39+
"""
40+
:type numCourses: int
41+
:type prerequisites: List[List[int]]
42+
:rtype: List[int]
43+
"""
44+
indegree = collections.defaultdict(set)
45+
outdegree = collections.defaultdict(set)
46+
for i, j in prerequisites:
47+
indegree[i].add(j)
48+
outdegree[j].add(i)
49+
stk = [i for i in xrange(numCourses) if i not in indegree]
50+
result = []
51+
while stk:
52+
node = stk.pop()
53+
result.append(node)
54+
for i in outdegree[node]:
55+
indegree[i].remove(node)
56+
if not indegree[i]:
57+
stk.append(i)
58+
del indegree[i]
59+
del outdegree[node]
60+
return result if not indegree and not outdegree else []

0 commit comments

Comments
 (0)