@@ -46,12 +46,51 @@ def findMedian(self) -> float:
46
46
"""
47
47
<Solution 2: 힙 활용>
48
48
49
- Time Complexity:
49
+ Time Complexity:
50
+ - addNum(): O(log n) - 힙에 삽입/삭제 연산
51
+ - findMedian(): O(1) - 힙의 루트 요소만 접근
50
52
51
53
Space Complexity:
54
+ - O(n) - 모든 입력 숫자를 두 개의 힙에 저장
52
55
53
56
풀이방법:
54
-
57
+ max/min heap을 사용해서 데이터를 절반씩 나누어 median 값을 찾음
58
+ 1. 자료구조
59
+ - lower (max heap)
60
+ - upper (min heap)
61
+ 2. addNum
62
+ - upper가 비어있거나 새로운 숫자가 upper[0]보다 크면 upper에 추가
63
+ - 그렇지 않으면 lower에 추가
64
+ 3. 균형 유지
65
+ - 두 힙의 크기 차이가 최대 1이 되도록 조정함
66
+ - lower가 더 많으면 upper로 이동
67
+ - upper가 2개 이상 더 많으면 lower로 이동
68
+ 4. 중간값 계산
69
+ - 홀수개: upper[0] (upper가 항상 1개 더 많거나 같기 때문)
70
+ - 짝수개: (-lower[0] + upper[0]) / 2
55
71
"""
56
72
from heapq import heappop , heappush
57
73
74
+ class MedianFinder :
75
+
76
+ def __init__ (self ):
77
+ self .lower = []
78
+ self .upper = []
79
+
80
+ def addNum (self , num : int ) -> None :
81
+ if not self .upper or self .upper [0 ] < num :
82
+ heappush (self .upper , num )
83
+ else :
84
+ heappush (self .lower , - num )
85
+
86
+ if len (self .lower ) > len (self .upper ):
87
+ heappush (self .upper , - heappop (self .lower ))
88
+ elif len (self .lower ) + 1 < len (self .upper ):
89
+ heappush (self .lower , - heappop (self .upper ))
90
+
91
+ def findMedian (self ) -> float :
92
+ if len (self .lower ) < len (self .upper ):
93
+ return self .upper [0 ]
94
+
95
+ else :
96
+ return (- self .lower [0 ] + self .upper [0 ]) / 2
0 commit comments