Skip to content

Commit f65b0fc

Browse files
authored
Merge pull request #1611 from HoonDongKang/main
[HoonDongKang] Week 13 Solutions
2 parents cbcbfae + 8360357 commit f65b0fc

File tree

5 files changed

+309
-0
lines changed

5 files changed

+309
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/**
2+
* [Problem]: [295] Find Median from Data Stream
3+
* (https://leetcode.com/problems/find-median-from-data-stream/description/)
4+
*/
5+
class Heap {
6+
private numbers: number[];
7+
private compare: (a: number, b: number) => boolean;
8+
9+
constructor(compare: (a: number, b: number) => boolean) {
10+
this.numbers = [];
11+
this.compare = compare;
12+
}
13+
14+
private getParentIdx(index: number) {
15+
return Math.floor((index - 1) / 2);
16+
}
17+
18+
private getLeftChildIdx(index: number) {
19+
return 2 * index + 1;
20+
}
21+
22+
private getRightChildIdx(index: number) {
23+
return 2 * index + 2;
24+
}
25+
26+
private swap(index1: number, index2: number): void {
27+
[this.numbers[index1], this.numbers[index2]] = [this.numbers[index2], this.numbers[index1]];
28+
}
29+
30+
private heapifyUp(index: number) {
31+
const parentIndex = this.getParentIdx(index);
32+
if (0 <= parentIndex && this.compare(this.numbers[index], this.numbers[parentIndex])) {
33+
this.swap(index, parentIndex);
34+
this.heapifyUp(parentIndex);
35+
}
36+
}
37+
38+
private heapifyDown(index: number): void {
39+
const leftChildIndex = this.getLeftChildIdx(index);
40+
const rightChildIndex = this.getRightChildIdx(index);
41+
let largestIndex = index;
42+
43+
if (
44+
leftChildIndex < this.numbers.length &&
45+
this.compare(this.numbers[leftChildIndex], this.numbers[largestIndex])
46+
) {
47+
largestIndex = leftChildIndex;
48+
}
49+
50+
if (
51+
rightChildIndex < this.numbers.length &&
52+
this.compare(this.numbers[rightChildIndex], this.numbers[largestIndex])
53+
) {
54+
largestIndex = rightChildIndex;
55+
}
56+
57+
if (largestIndex !== index) {
58+
this.swap(index, largestIndex);
59+
this.heapifyDown(largestIndex);
60+
}
61+
}
62+
63+
insert(number: number) {
64+
this.numbers.push(number);
65+
this.heapifyUp(this.numbers.length - 1);
66+
}
67+
68+
pop() {
69+
if (this.numbers.length === 0) {
70+
return null;
71+
}
72+
73+
if (this.numbers.length === 1) {
74+
return this.numbers.pop()!;
75+
}
76+
77+
const root = this.numbers[0];
78+
this.numbers[0] = this.numbers.pop()!;
79+
this.heapifyDown(0);
80+
81+
return root;
82+
}
83+
84+
peek() {
85+
return this.numbers.length > 0 ? this.numbers[0] : null;
86+
}
87+
88+
size(): number {
89+
return this.numbers.length;
90+
}
91+
}
92+
93+
class MedianFinder {
94+
private smallHeap: Heap;
95+
private largeHeap: Heap;
96+
97+
constructor() {
98+
this.smallHeap = new Heap((a, b) => a > b);
99+
this.largeHeap = new Heap((a, b) => a < b);
100+
}
101+
102+
//시간복잡도 O(log n)
103+
addNum(num: number): void {
104+
this.smallHeap.insert(num);
105+
this.largeHeap.insert(this.smallHeap.pop()!);
106+
107+
if (this.smallHeap.size() < this.largeHeap.size()) {
108+
this.smallHeap.insert(this.largeHeap.pop()!);
109+
}
110+
}
111+
112+
//시간복잡도 O(1)
113+
findMedian(): number {
114+
if (this.smallHeap.size() > this.largeHeap.size()) {
115+
return this.smallHeap.peek()!;
116+
} else {
117+
return (this.smallHeap.peek()! + this.largeHeap.peek()!) / 2;
118+
}
119+
}
120+
}
121+
122+
/**
123+
* Your MedianFinder object will be instantiated and called as such:
124+
* var obj = new MedianFinder()
125+
* obj.addNum(num)
126+
* var param_2 = obj.findMedian()
127+
*/

insert-interval/HoonDongKang.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* [Problem]: [57] Insert Interval
3+
* (https://leetcode.com/problems/insert-interval/)
4+
*/
5+
6+
//시간복잡도 O(n)
7+
//공간복잡도 O(n)
8+
function insert(intervals: number[][], newInterval: number[]): number[][] {
9+
const result: number[][] = [];
10+
11+
let idx = 0;
12+
13+
while (idx < intervals.length && intervals[idx][1] < newInterval[0]) {
14+
result.push(intervals[idx]);
15+
idx++;
16+
}
17+
18+
while (idx < intervals.length && intervals[idx][0] <= newInterval[1]) {
19+
newInterval = [
20+
Math.min(intervals[idx][0], newInterval[0]),
21+
Math.max(intervals[idx][1], newInterval[1]),
22+
];
23+
idx++;
24+
}
25+
26+
result.push(newInterval);
27+
28+
while (idx < intervals.length) {
29+
result.push(intervals[idx]);
30+
idx++;
31+
}
32+
33+
return result;
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* [Problem]: [230] Kth Smallest Element in a BST
3+
* (https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
function kthSmallest(root: TreeNode | null, k: number): number {
18+
//시간복잡도 O(n)
19+
//공간복잡도 O(n)
20+
function inOrderFunc(root: TreeNode | null, k: number): number {
21+
const values: number[] = [];
22+
23+
function dfs(node: TreeNode | null) {
24+
if (!node) return;
25+
dfs(node.left);
26+
values.push(node.val);
27+
dfs(node.right);
28+
}
29+
30+
dfs(root);
31+
32+
return values[k - 1];
33+
}
34+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/**
2+
* [Problem]: [235] Lowest Common Ancestor of a Binary Search Tree
3+
* (https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
function lowestCommonAncestor(
18+
root: TreeNode | null,
19+
p: TreeNode | null,
20+
q: TreeNode | null
21+
): TreeNode | null {
22+
//시간복잡도 O(h)
23+
//공간복잡도 O(h)
24+
function recursiveFunc(
25+
root: TreeNode | null,
26+
p: TreeNode | null,
27+
q: TreeNode | null
28+
): TreeNode | null {
29+
if (!p || !root || !q) return null;
30+
if (p.val < root.val && q.val < root.val) {
31+
return recursiveFunc(root.left, p, q);
32+
}
33+
if (root.val < p.val && root.val < q.val) {
34+
return recursiveFunc(root.right, p, q);
35+
}
36+
37+
return root;
38+
}
39+
40+
//시간복잡도 O(h)
41+
//공간복잡도 O(1)
42+
function loopFunc(
43+
root: TreeNode | null,
44+
p: TreeNode | null,
45+
q: TreeNode | null
46+
): TreeNode | null {
47+
if (!p || !q || !root) return null;
48+
49+
let node = root;
50+
51+
while (node) {
52+
if (p.val < node.val && q.val < node.val) {
53+
node = node?.left!;
54+
} else if (p.val > node.val && q.val > node.val) {
55+
node = node?.right!;
56+
} else {
57+
return node;
58+
}
59+
}
60+
61+
return null;
62+
}
63+
}

meeting-rooms/HoonDongKang.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* [Problem]: [920] Meeting Rooms
3+
* (https://www.lintcode.com/problem/920/)
4+
*/
5+
6+
export class Interval {
7+
start: number;
8+
end: number;
9+
constructor(start: number, end: number) {
10+
this.start = start;
11+
this.end = end;
12+
}
13+
}
14+
15+
export class Solution {
16+
/**
17+
* @param intervals: an array of meeting time intervals
18+
* @return: if a person could attend all meetings
19+
*/
20+
canAttendMeetings(intervals: Interval[]): boolean {
21+
//시간복잡도 O(n^2)
22+
//공간복잡도 O(1)
23+
function bruteForceFunc(intervals: Interval[]): boolean {
24+
for (let i = 0; i < intervals.length; i++) {
25+
for (let j = i + 1; j < intervals.length; j++) {
26+
const first = intervals[i];
27+
const second = intervals[j];
28+
if (first.start < second.end && second.start < first.end) {
29+
return false;
30+
}
31+
}
32+
}
33+
34+
return true;
35+
}
36+
37+
//시간복잡도 O(nlogn)
38+
//공간복잡도 O(1)
39+
function sortedFunc(intervals: Interval[]): boolean {
40+
intervals.sort((a, b) => a.start - b.start);
41+
42+
for (let i = 0; i < intervals.length - 1; i++) {
43+
if (intervals[i].end > intervals[i + 1].start) {
44+
return false;
45+
}
46+
}
47+
48+
return true;
49+
}
50+
}
51+
}

0 commit comments

Comments
 (0)