Skip to content

Commit 2e444ee

Browse files
authored
feat: find-median-from-data-stream solution
1 parent 5f344b1 commit 2e444ee

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
2+
/**
3+
* μ‹œκ°„ λ³΅μž‘λ„: O(nlogn) - sort λ©”μ†Œλ“œ
4+
*/
5+
// class MedianFinder {
6+
// arr: number[]
7+
// constructor() {
8+
// this.arr = [];
9+
// }
10+
11+
// addNum(num: number): void {
12+
// this.arr.push(num)
13+
// this.arr.sort((a, b) => a - b);
14+
// }
15+
16+
// findMedian(): number {
17+
// const len = this.arr.length;
18+
// const mid = Math.floor(len / 2);
19+
// if(len % 2) return this.arr[mid];
20+
// else return (this.arr[mid - 1] + this.arr[mid]) / 2;
21+
// }
22+
// }
23+
24+
/**
25+
* μ‹œκ°„ λ³΅μž‘λ„: O(log n) - νž™ μ—°μ‚°μ˜ μ‹œκ°„ λ³΅μž‘λ„
26+
* 곡간 λ³΅μž‘λ„: O(n) - n개의 숫자λ₯Ό μ €μž₯ν•˜λŠ” 데 ν•„μš”ν•œ 곡간
27+
*/
28+
class MedianFinder {
29+
maxHeap = new MaxPriorityQueue() // μ΅œλŒ€κ°’μ„ 트리의 λ£¨νŠΈμ— μœ„μΉ˜μ‹œν‚€λŠ” νž™
30+
minHeap = new MinPriorityQueue() // μ΅œμ†Œκ°’μ„ 트리의 λ£¨νŠΈμ— μœ„μΉ˜μ‹œν‚€λŠ” νž™
31+
size: number
32+
33+
constructor() {
34+
this.size = 0
35+
}
36+
37+
addNum(num: number): void {
38+
this.size++
39+
this.maxHeap.enqueue(num) // λ¨Όμ € μ΅œλŒ€ νž™μ— μΆ”κ°€
40+
const item = this.maxHeap.dequeue() // μ΅œλŒ€ νž™μ˜ μ΅œλŒ€κ°’ 제거
41+
this.minHeap.enqueue(item) // μ΅œμ†Œ νž™μ— μΆ”κ°€
42+
43+
// μ΅œμ†Œ νž™μ΄ 크면 μ΅œλŒ€ νž™μœΌλ‘œ 이동
44+
if (this.minHeap.size() > this.maxHeap.size()+1) {
45+
const item = this.minHeap.dequeue()
46+
this.maxHeap.enqueue(item)
47+
}
48+
}
49+
50+
findMedian(): number {
51+
if (this.size % 2 !== 0) {
52+
// μ΅œμ†Œ νž™μ˜ μ΅œμ†Œκ°’
53+
return this.minHeap.front()
54+
} else {
55+
// μ΅œλŒ€ νž™μ˜ μ΅œλŒ€κ°’(root)κ³Ό μ΅œμ†Œ νž™μ˜ μ΅œμ†Œκ°’(root)의 평균
56+
return (this.maxHeap.front() + this.minHeap.front()) / 2
57+
}
58+
}
59+
}
60+
/**
61+
* Your MedianFinder object will be instantiated and called as such:
62+
* var obj = new MedianFinder()
63+
* obj.addNum(num)
64+
* var param_2 = obj.findMedian()
65+
*/

0 commit comments

Comments
Β (0)