@@ -46,12 +46,51 @@ def findMedian(self) -> float:
4646"""
4747<Solution 2: 힙 활용>
4848
49- Time Complexity:
49+ Time Complexity:
50+ - addNum(): O(log n) - 힙에 삽입/삭제 연산
51+ - findMedian(): O(1) - 힙의 루트 요소만 접근
5052
5153Space Complexity:
54+ - O(n) - 모든 입력 숫자를 두 개의 힙에 저장
5255
5356풀이방법:
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
5571"""
5672from heapq import heappop , heappush
5773
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