File tree Expand file tree Collapse file tree 5 files changed +157
-0
lines changed
binary-tree-maximum-path-sum
maximum-depth-of-binary-tree Expand file tree Collapse file tree 5 files changed +157
-0
lines changed Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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 )
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments