Skip to content

Commit 7fc0c7d

Browse files
committed
[Leo] 9th Week solutions (rest 3Qs)
1 parent 945d82a commit 7fc0c7d

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

clone-graph/Leo.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution:
2+
def cloneGraph(self, node: 'Node') -> 'Node':
3+
oldToNew = {}
4+
5+
def dfs(node):
6+
if node in oldToNew:
7+
return oldToNew[node]
8+
9+
copy = Node(node.val)
10+
oldToNew[node] = copy
11+
12+
for nei in node.neighbors:
13+
copy.neighbors.append(dfs(nei))
14+
15+
return copy
16+
17+
return dfs(node) if node else None
18+
19+
## TC: O(num(node) + num(edge))
20+
## SC: O(num(node))

course-schedule/Leo.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
3+
indegree = collections.defaultdict(int)
4+
adj_list = collections.defaultdict(list)
5+
6+
for pre in prerequisites:
7+
indegree[pre[0]] += 1
8+
adj_list[pre[1]].append(pre[0])
9+
10+
starts = deque([i for i in range(numCourses) if indegree[i] == 0])
11+
visited = set()
12+
13+
for start in starts:
14+
self.dfs(indegree, adj_list, start, visited)
15+
16+
return len(visited) == numCourses
17+
18+
def dfs(self, indegree, adj_list, start, visited):
19+
if start in visited:
20+
return
21+
visited.add(start)
22+
for neigh in adj_list[start]:
23+
indegree[neigh] -= 1
24+
if indegree[neigh] == 0:
25+
self.dfs(indegree, adj_list, neigh, visited)
26+
27+
## TC & SC: O(num(node)+num(edge))

pacific-atlantic-water-flow/Leo.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def pacificAtlantic(self, heights: List[List[int]]) -> List[List[int]]:
3+
if not heights or not heights[0]:
4+
return []
5+
6+
m, n = len(heights), len(heights[0])
7+
p_visited = set()
8+
a_visited = set()
9+
directions = [(-1, 0), (1, 0), (0, 1), (0, -1)]
10+
11+
def dfs(visited, x, y):
12+
visited.add((x, y))
13+
for dx, dy in directions:
14+
new_x, new_y = x + dx, y + dy
15+
if 0 <= new_x < m and 0 <= new_y < n and (new_x, new_y) not in visited and heights[new_x][new_y] >= \
16+
heights[x][y]:
17+
dfs(visited, new_x, new_y)
18+
19+
for i in range(m):
20+
dfs(p_visited, i, 0)
21+
dfs(a_visited, i, n - 1)
22+
23+
for j in range(n):
24+
dfs(p_visited, 0, j)
25+
dfs(a_visited, m - 1, j)
26+
27+
return list(p_visited.intersection(a_visited))
28+
29+
## TC: O(mn), SC: O(mn)

0 commit comments

Comments
 (0)