The median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value and the median is the mean of the two middle values.
arr = [2,3,4], the median is 3.arr = [2,3], the median is (2 + 3) / 2 = 2.5.Implement the MedianFinder class:
MedianFinder() initializes the MedianFinder object.void addNum(int num) adds the integer num from the data stream to the data structure.double findMedian() returns the median of all elements so far. Answers within 105 of the actual answer will be accepted.Example 1:
Input
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
Output
[null, null, null, 1.5, null, 2.0]
Explanation
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1); // arr = [1]
medianFinder.addNum(2); // arr = [1, 2]
medianFinder.findMedian(); // return 1.5 (i.e., (1 + 2) / 2)
medianFinder.addNum(3); // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0
Constraints:
105 <= num <= 105findMedian.5 * 104 calls will be made to addNum and findMedian.Find Median from Data Stream - LeetCode
https://www.youtube.com/watch?v=1LkOrc-Le-Y&ab_channel=TECHDOSE
/*
Approach:
Priority Queue, O(NlogN)
*/
class MedianFinder {
public:
/** initialize your data structure here. */
priority_queue<int> maxheap;
priority_queue<int,vector<int>,greater<>> minheap;
MedianFinder() {
}
void addNum(int num) {
int lsize = maxheap.size();
int rsize = minheap.size();
if(lsize==0)
maxheap.push(num);
else if(lsize==rsize)//disbalance can occur at minheap (right) side
{
if(num>minheap.top())// num has to come to right side in the sorted array
{
int temp = minheap.top();
minheap.pop();
maxheap.push(temp);
minheap.push(num);
}
else
maxheap.push(num);
}
else//lsize==1+rsize, left side can become unbalanced
{
if(num<maxheap.top())// num has to come to left side in the sorted array
{
int temp = maxheap.top();
maxheap.pop();
minheap.push(temp);
maxheap.push(num);
}
else
minheap.push(num);
}
}
double findMedian() {
int lsize = maxheap.size();
int rsize = minheap.size();
int size = lsize+rsize;
double num1 = maxheap.top(),num2;
if(!minheap.empty())
num2 = minheap.top();
if(size%2==0)
return (num1+num2)/2;
else
return num1;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/