Skip to content

Commit a84449d

Browse files
committed
Feat: Week 13 solutions
1 parent d198ece commit a84449d

File tree

5 files changed

+143
-0
lines changed

5 files changed

+143
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
minHeap이 항상 maxHeap보다 크거나 같도록 유지한다.
3+
addNum()
4+
- maxHeap에 새로 들어온 num을 포함한 최댓값을 minHeap으로 옮긴다
5+
- 처음엔 maxHeap과 minHeap의 크기 차이가 1이므로 if문에 들어가지 않지만
6+
- 이후 num이 minHeap으로 하나 더 넘어가게 되면 maxHeap과 minHeap의 크기 차이가 2가 되므로
7+
if문에 들어가서 maxHeap쪽으로 minHeap의 최솟값을 옮긴다
8+
힙 삽입에 O(logn)이 걸리므로 시간복잡도는 O(logn)이다
9+
findMedian()
10+
- 두 힙의 top만 참조하면 되므로 시간 복잡도는 O(1)이다
11+
최소힙과 최대힙은 각각 전체 수의 절반씩을 저장한다.
12+
공간 복잡도는 O(n)이다
13+
*/
14+
class MedianFinder {
15+
public:
16+
priority_queue<int> maxHeap;
17+
priority_queue<int, vector<int>, greater<int>> minHeap;
18+
19+
MedianFinder() {
20+
}
21+
22+
void addNum(int num) {
23+
maxHeap.push(num);
24+
25+
minHeap.push(maxHeap.top());
26+
maxHeap.pop();
27+
28+
if (maxHeap.size() + 1 < minHeap.size()) {
29+
maxHeap.push(minHeap.top());
30+
minHeap.pop();
31+
}
32+
}
33+
34+
double findMedian() {
35+
if (maxHeap.size() == minHeap.size())
36+
return (minHeap.top() + maxHeap.top()) / 2.0;
37+
return minHeap.top();
38+
}
39+
};

insert-interval/crumbs22.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
4+
vector<vector<int>> res;
5+
int i = 0;
6+
7+
// 겹치지 않을 때 res 벡터에 intervals를 그대로 삽입
8+
while (i < intervals.size() && intervals[i][1] < newInterval[0]) {
9+
res.push_back(intervals[i]);
10+
i++;
11+
}
12+
13+
// 겹치는 동안 반복하며 시작지점과 끝지점 갱신
14+
while (i < intervals.size() && intervals[i][0] <= newInterval[1]) {
15+
newInterval[0] = min(intervals[i][0], newInterval[0]);
16+
newInterval[1] = max(newInterval[1], intervals[i][1]);
17+
i++;
18+
}
19+
res.push_back(newInterval); // 삽입
20+
21+
// 남은 벡터 마저 삽입
22+
while (i < intervals.size()) {
23+
res.push_back(intervals[i]);
24+
i++;
25+
}
26+
return (res);
27+
}
28+
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
dfs로 트리 탐색하며 k번째로 작은 값을 찾음
3+
왼쪽서브트리-> 루트 -> 오른쪽 서브트리 순으로 탐색 (중위순회)
4+
왼쪽 서브트리를 먼저 탐색함 (값이 작은 순으로 탐색하기 위함)
5+
- 왼쪽이 없으면 return -1
6+
- 현재 노드 방문 -> k를 1 감소
7+
- 오른쪽도 같은 방식으로 탐색
8+
- 자식에서 -1을 반환 받았을 때에는 k번째 작은 값을 찾지 못한 상태로, k값을 줄이며 계속 탐색
9+
- 자식에서 -1이 아닌 값을 반환 받았을 때에는 k번째 작은 값을 찾은 상태로, 해당 값을 계속적으로 반환
10+
*/
11+
class Solution {
12+
public:
13+
int kthSmallest(TreeNode* root, int k) {
14+
return (dfs(root, k));
15+
}
16+
17+
int dfs(TreeNode* root, int &k) {
18+
if (!root)
19+
return -1;
20+
21+
int l = dfs(root->left, k);
22+
if (l != -1)
23+
return l;
24+
k--;
25+
if (k == 0) // 현재 노드가 k번째로 작은 값일 때
26+
return root->val;
27+
return dfs(root->right, k);
28+
}
29+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
p와 q의 공통조상을 찾는 문제
3+
왼쪽과 오른쪽에서 각각 p와 q를 찾고, 만약 좌우에서 모두 p와 q를 찾았다면 현재 노드가 공통 조상이다
4+
p와 q 중 하나만 존재한다면 존재하는 쪽의 노드에 공통조상이 존재한다
5+
모든 노드를 한번씩 방문하므로 시간복잡도는 O(n)이다. 공간복잡도는 트리의 높이에 비례하므로 O(h).
6+
*/
7+
class Solution {
8+
public:
9+
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
10+
if (!root)
11+
return nullptr;
12+
if (root->val == p->val)
13+
return p;
14+
if (root->val == q->val)
15+
return q;
16+
17+
TreeNode* nl = lowestCommonAncestor(root->left, p, q);
18+
TreeNode* nr = lowestCommonAncestor(root->right, p, q);
19+
if (!nl && nr) // nl쪽이 비어있으면 nr쪽에 공통조상 존재
20+
return nr;
21+
else if (!nr) // nr쪽이 비어있으면 nl쪽에 공통조상 존재
22+
return nl;
23+
else // 그 외의 경우는 nr과 nl의 부모에 공통조상 존재
24+
return root;
25+
}
26+
};

meeting-rooms/crumbs22.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
/**
4+
* @param intervals: an array of meeting time intervals
5+
* @return: if a person could attend all meetings
6+
*/
7+
bool canAttendMeetings(vector<Interval> &intervals) {
8+
// 시작 시간 기준으로 정렬
9+
sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b) {
10+
return a.start < b.start;
11+
});
12+
13+
// 시작시간과 끝시간을 비교해서 겹치면 false 반환
14+
for (int i = 1; i < intervals.size(); i++) {
15+
if (intervals[i].start < intervals[i - 1].end) {
16+
return false;
17+
}
18+
}
19+
return true;
20+
}
21+
};

0 commit comments

Comments
 (0)