Skip to content

Commit a6d7581

Browse files
committed
feat: [Week 11]
1 parent 97ef058 commit a6d7581

File tree

5 files changed

+157
-0
lines changed

5 files changed

+157
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
8+
"""
9+
Solution: DFS
10+
1) dfs 로 left, right 각각의 max 값을 구한다.
11+
2) maxSum 을 업데이트하고,
12+
3) return value 로는 leftMax 또는 rightMax 와의 합만 리턴한다.
13+
(left, right 를 둘 다 포함하는 경우와 둘 중 하나만 선택하는 경우를 나눔)
14+
15+
Time: O(n)
16+
Space: O(n)
17+
18+
"""
19+
20+
21+
class Solution:
22+
def maxPathSum(self, root: Optional[TreeNode]) -> int:
23+
maxSum = root.val
24+
25+
def dfs(root):
26+
nonlocal maxSum
27+
if not root:
28+
return 0
29+
30+
leftMax = dfs(root.left)
31+
rightMax = dfs(root.right)
32+
leftMax = max(leftMax, 0)
33+
rightMax = max(rightMax, 0)
34+
35+
maxSum = max(maxSum, root.val + leftMax + rightMax)
36+
return root.val + max(leftMax, rightMax)
37+
38+
dfs(root)
39+
return maxSum

graph-valid-tree/Chaedie.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""
2+
Conditions of Valid Tree
3+
1) no Loop
4+
2) all nodes has to be connected
5+
"""
6+
7+
8+
class Solution:
9+
def validTree(self, n: int, edges: List[List[int]]) -> bool:
10+
if not n:
11+
return True
12+
13+
# Make Graph
14+
graph = {i: [] for i in range(n)}
15+
for n1, n2 in edges:
16+
graph[n1].append(n2)
17+
graph[n2].append(n1)
18+
19+
# loop check
20+
visit = set()
21+
22+
def dfs(i, prev):
23+
if i in visit:
24+
return False
25+
26+
visit.add(i)
27+
for j in graph[i]:
28+
if j == prev:
29+
continue
30+
if not dfs(j, i):
31+
return False
32+
return True
33+
34+
return dfs(0, None) and n == len(visit)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""
2+
Solution: BFS
3+
Time: O(n)
4+
Space: O(n)
5+
"""
6+
7+
8+
class Solution:
9+
def maxDepth(self, root: Optional[TreeNode]) -> int:
10+
if not root:
11+
return 0
12+
13+
q = deque([root])
14+
maxLevel = 0
15+
while q:
16+
maxLevel += 1
17+
for i in range(len(q)):
18+
node = q.popleft()
19+
if node.left:
20+
q.append(node.left)
21+
if node.right:
22+
q.append(node.right)
23+
return maxLevel

merge-intervals/Chaedie.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""
2+
Time: O(n log(n))
3+
Space: O(n)
4+
"""
5+
6+
7+
class Solution:
8+
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
9+
intervals.sort(key=lambda x: x[0])
10+
result = [intervals[0]]
11+
12+
for start, end in intervals[1:]:
13+
prev = result[-1]
14+
15+
if prev[0] <= start <= prev[1]:
16+
result[-1][1] = max(prev[1], end)
17+
else:
18+
result.append([start, end])
19+
return result

reorder-list/Chaedie.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
가장 뒤부터 돌아오는 방법을 찾아야한다.
3+
1) 재귀 스택 방식
4+
2) 새로운 리스트를 만드는 방법
5+
3) two pointer 로 반 잘라서 reverse 한 뒤 merge
6+
"""
7+
8+
"""
9+
Solution: 3) Two pointer
10+
Time: O(n)
11+
Space: O(1)
12+
"""
13+
14+
15+
class Solution:
16+
def reorderList(self, head: Optional[ListNode]) -> None:
17+
18+
# 절반 자르기
19+
slow, fast = head, head.next
20+
while fast and fast.next:
21+
slow = slow.next
22+
fast = fast.next.next
23+
24+
# Reverse
25+
second = slow.next
26+
slow.next = None
27+
prev = None
28+
while second:
29+
tmp = second.next
30+
second.next = prev
31+
prev = second
32+
second = tmp
33+
34+
# Merge
35+
first = head
36+
second = prev
37+
while second:
38+
tmp1, tmp2 = first.next, second.next
39+
first.next = second
40+
second.next = tmp1
41+
first = tmp1
42+
second = tmp2

0 commit comments

Comments
 (0)