package
0.0.0-20241220224003-b7cf03a90b2b
Repository: https://github.com/szhou12/leetcode-go.git
Documentation: pkg.go.dev
# README
295. Find Median from Data Stream
Solution idea
MinHeap Stores Largest & MaxHeap Stores Smallest
维护两个堆: left (MaxHeap) 和 right (MinHeap)。
left (MaxHeap) 始终保持 前一半最小的元素,因为是大顶堆,所以出口是第 n/2 小的元素。人为规定:如果奇数个元素,调整left比right多存一个元素。i.e., left:right = n:n or n+1:n
right (MinHeap) 存后一半较大的所有元素。
执行Add()
操作时:我们看left和right的size:
- 如果
n:n
:说明已有偶数个元素,加进来新元素后将成为奇数个,需调整为n+1:n
:流程为n:n -> n:n+1 -> n+1:n
。先把新元素放进right"涮"一下,然后把Mright的出口元素放进left。 - 否则:说明已有奇数个元素,加进来新元素后将成为偶数个,根据规定,left多一个,需调整为
n+1:n+1
:流程为n+1:n -> n+2:n -> n+1:n+1
。先把新元素放进left"涮"一下,然后把left的出口元素放进right。
执行Get()
操作时:如果left和right刚好相等,那么两者的出口元素取平均就是中位数。否则,根据规定,left多一个元素,所以left的出口元素就是中位数。
Time complexity = $O(\log n)$