Skip to content

Commit e3f3af7

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 5caa51a + 235c5f8 commit e3f3af7

20 files changed

Lines changed: 500 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import heapq
2+
3+
class MedianFinder:
4+
5+
def __init__(self):
6+
self.max_heap = []
7+
self.min_heap = []
8+
9+
def addNum(self, num: int) -> None:
10+
if not self.min_heap or self.min_heap[0] <= num:
11+
heapq.heappush(self.min_heap, num)
12+
else:
13+
heapq.heappush(self.max_heap, -num)
14+
15+
if len(self.min_heap) < len(self.max_heap):
16+
heapq.heappush(self.min_heap, -heapq.heappop(self.max_heap))
17+
elif len(self.min_heap) > len(self.max_heap) + 1:
18+
heapq.heappush(self.max_heap, -heapq.heappop(self.min_heap))
19+
20+
def findMedian(self) -> float:
21+
if len(self.min_heap) == len(self.max_heap):
22+
return (self.min_heap[0]-self.max_heap[0])/2
23+
else:
24+
return self.min_heap[0]
25+
26+

‎insert-interval/8804who.py‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution:
2+
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
3+
new_start = 1e9
4+
new_end = -1
5+
6+
answer = []
7+
8+
for start, end in intervals:
9+
if start <= newInterval[0] <= end or newInterval[0] <= start <= newInterval[1] or newInterval[0] <= end <= newInterval[1] or start <= newInterval[1] <= end:
10+
if new_start == 1e9:
11+
new_start = start
12+
new_end = end
13+
else:
14+
answer.append([start, end])
15+
new_start = min(new_start, newInterval[0])
16+
new_end = max(new_end, newInterval[1])
17+
18+
answer.append([new_start, new_end])
19+
return sorted(answer)
20+

‎insert-interval/Seoya0512.py‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'''
2+
Time Complexity : O(N)
3+
- newInterval을 삽입할 위치 탐색 O(N)
4+
- Intervals 병합을 위해 for문으로 모든 구간을 순회 O(N)
5+
- O(N) + O(N) = O(N)
6+
7+
Space Complexity : O(N)
8+
- output 리스트에 모든 구간을 저장 O(N)
9+
10+
'''
11+
class Solution:
12+
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
13+
idx = 0
14+
while idx < len(intervals) and intervals[idx][0] < newInterval[0]:
15+
idx +=1
16+
intervals.insert(idx, newInterval) # newInterval을 삽입할 위치 탐색 (O(N))
17+
18+
# Intervals 병합
19+
output = [intervals[0]]
20+
for interval in intervals[1:]:
21+
# 이전 구간과 겹치는 경우
22+
if output[-1][1] >= interval[0]:
23+
output[-1][1] = max(output[-1][1], interval[1])
24+
else:
25+
output.append(interval)
26+
return output

‎insert-interval/ppxyn1.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# idea: -
2+
# Time Complexity: O(n)
3+
class Solution:
4+
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
5+
res = []
6+
7+
# Ex,. newInterval = [2,5]
8+
for i in range(len(intervals)):
9+
start, end = intervals[i]
10+
11+
# [2,5] > [1,5]
12+
13+
# already passed
14+
if end < newInterval[0]:
15+
res.append(intervals[i])
16+
17+
# not started yet
18+
# (2)
19+
elif newInterval[1] < start:
20+
res.append(newInterval) # [1,5]
21+
for j in range(i, len(intervals)):
22+
res.append(intervals[j])
23+
return res
24+
else:
25+
# (1)
26+
# overlapping
27+
newInterval[0] = min(newInterval[0], start)
28+
newInterval[1] = max(newInterval[1], end)
29+
30+
res.append(newInterval)
31+
return res
32+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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+
class Solution:
8+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
9+
answer = 0
10+
11+
def dfs(node):
12+
nonlocal k
13+
nonlocal answer
14+
if node.left:
15+
dfs(node.left)
16+
k -= 1
17+
if k == 0:
18+
answer = node.val
19+
return
20+
if node.right:
21+
dfs(node.right)
22+
dfs(root)
23+
24+
return answer
25+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
'''
2+
Time Complexity: O(N)
3+
- dfs 함수가 모든 노드를 중위순회 방식으로 방문함므로 O(N) 소요
4+
5+
Space Complexity: O(N)
6+
- aligned_arr 리스트에 모든 노드의 값을 저장하므로 O(N) 소요
7+
- 재귀 호출 스택이 최대 트리의 높이만큼 쌓일 수 있으므로 최악의 경우 O(N) 소요
8+
'''
9+
10+
# Definition for a binary tree node.
11+
# class TreeNode:
12+
# def __init__(self, val=0, left=None, right=None):
13+
# self.val = val
14+
# self.left = left
15+
# self.right = right
16+
class Solution:
17+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
18+
aligned_arr = []
19+
20+
def dfs(node):
21+
if not node:
22+
return
23+
dfs(node.left)
24+
aligned_arr.append(node.val)
25+
dfs(node.right)
26+
27+
dfs(root)
28+
29+
return aligned_arr[k - 1]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
#idea : DFS (inorder)
9+
#Time Complexity: O(n)
10+
11+
class Solution:
12+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
13+
stack = []
14+
cnt = 0
15+
curr = root
16+
if not curr:
17+
return
18+
19+
while curr or stack:
20+
while curr:
21+
stack.append(curr)
22+
curr = curr.left
23+
curr = stack.pop()
24+
cnt += 1
25+
26+
if cnt == k:
27+
return curr.val
28+
29+
curr = curr.right
30+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* struct TreeNode {
4+
* int val;
5+
* TreeNode *left;
6+
* TreeNode *right;
7+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
8+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10+
* };
11+
*/
12+
class Solution {
13+
public:
14+
vector<int> values;
15+
16+
void dfs(TreeNode* node) {
17+
if(node == nullptr)
18+
return;
19+
dfs(node->left);
20+
values.push_back(node->val);
21+
dfs(node->right);
22+
}
23+
24+
int kthSmallest(TreeNode* root, int k) {
25+
dfs(root);
26+
return values[k - 1];
27+
}
28+
};
29+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution:
9+
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
10+
if p.val < root.val and q.val < root.val:
11+
return self.lowestCommonAncestor(root.left, p, q)
12+
if p.val > root.val and q.val > root.val:
13+
return self.lowestCommonAncestor(root.right, p, q)
14+
return root
15+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
'''
2+
Time Complexity: O(H)
3+
- H는 트리의 높이
4+
'''
5+
6+
class Solution:
7+
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
8+
if p.val < root.val and q.val < root.val:
9+
return self.lowestCommonAncestor(root.left, p, q)
10+
if p.val > root.val and q.val > root.val:
11+
return self.lowestCommonAncestor(root.right, p, q)
12+
return root

0 commit comments

Comments
 (0)