Skip to content

Commit 01deda8

Browse files
committed
Add heap-based solution for Find Median from Data Stream
1 parent 9000f18 commit 01deda8

File tree

1 file changed

+41
-2
lines changed

1 file changed

+41
-2
lines changed

find-median-from-data-stream/KwonNayeon.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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
5153
Space 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
"""
5672
from 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

Comments
 (0)