File tree Expand file tree Collapse file tree 1 file changed +72
-0
lines changed
find-median-from-data-stream Expand file tree Collapse file tree 1 file changed +72
-0
lines changed Original file line number Diff line number Diff line change 1+ // 배열 + 이분 탐색 삽입 (정렬) 로 풀이함
2+
3+ // 다른 방식으로는 듀얼 힙을 사용하는 게 있음 (성능 면에서 더 우수함)
4+ // 최소힙, 최대힙 두 개를 두고 나눠서 add 이 때 size 차이는 1 이하여야 함
5+ // ex. 1 2 3 4 5 6 => 최대 힙에 1 2 3, 최소 힙에 4 5 6 => (3 + 4) / 2
6+ // ex. 2 3 4 => 최대 힙에 2 3, 최소 힙에 4 => 3
7+ // 참고로 leetcode에서 JS를 위한 MaxPriorityQueue와 같은 자료구조를 제공하는 듯 한데...
8+ // 메서드를 어디서 볼 수 있는지 모르겠음
9+
10+ class MedianFinder {
11+ constructor ( ) {
12+ this . nums = [ ] ;
13+ }
14+
15+ /**
16+ * 시간복잡도: O(n) (이분탐색: log n, splice: n)
17+ * 공간복잡도: O(1)
18+ * @param {number } num
19+ * @return {void }
20+ */
21+ addNum ( num ) {
22+ const i = this . #findInsertPosition( num ) ;
23+ this . nums . splice ( i , 0 , num ) ;
24+ }
25+
26+ /**
27+ * 이진 탐색으로 삽입 지점 찾는 함수
28+ * 시간복잡도: O(log n)
29+ * 공간복잡도: O(1)
30+ */
31+ #findInsertPosition( num ) {
32+ let left = 0 ;
33+ let right = this . nums . length ;
34+
35+ while ( left <= right ) {
36+ const mid = Math . floor ( ( left + right ) / 2 ) ;
37+
38+ if ( num < this . nums [ mid ] ) {
39+ right = mid - 1 ;
40+ } else if ( this . nums [ mid ] < num ) {
41+ left = mid + 1 ;
42+ } else {
43+ return mid ;
44+ }
45+ }
46+
47+ return left ;
48+ }
49+
50+ /**
51+ * 시간복잡도: O(1)
52+ * 공간복잡도: O(1)
53+ * @return {number }
54+ */
55+ findMedian ( ) {
56+ const len = this . nums . length ;
57+ const midIndex = Math . floor ( len / 2 ) ;
58+
59+ if ( len % 2 === 0 ) {
60+ return ( this . nums [ midIndex - 1 ] + this . nums [ midIndex ] ) / 2 ;
61+ } else {
62+ return this . nums [ midIndex ] ;
63+ }
64+ }
65+ } ;
66+
67+ /**
68+ * Your MedianFinder object will be instantiated and called as such:
69+ * var obj = new MedianFinder()
70+ * obj.addNum(num)
71+ * var param_2 = obj.findMedian()
72+ */
You can’t perform that action at this time.
0 commit comments