Problem Statement

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.

Implement the MedianFinder class:

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:

Problem Link

Find Median from Data Stream - LeetCode

Reference Video

https://www.youtube.com/watch?v=1LkOrc-Le-Y&ab_channel=TECHDOSE

Code

/*
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();
 */