You are on page 1of 2

class Solution {

public:
vector<double> medianSlidingWindow(vector<int>& v, int k) {
int n = v.size();
int ind = 0;
multiset <int> maxset, minset;
vector <double> ans;

while (ind < k)


{
maxset.insert(v[ind]);
if (maxset.size() > minset.size() + 1)
{
int aux = *maxset.begin();
maxset.insert(*minset.begin());
minset.erase(minset.begin());
minset.insert(aux);
}
++ind;
}
while (ind < n)
{
if (k % 2 == 1) ans.push_back(*maxset.begin());
else ans.push_back(1.0 * (*maxset.begin() + *minset.begin()) / 2);
maxset.insert(v[ind]);
if (maxset.size() > minset.size() + 1)
{
int aux = *maxset.begin();
maxset.insert(*minset.begin());
minset.erase(minset.begin());
minset.insert(aux);
}
if (maxset.find(v[ind - k]) != maxset.end())
maxset.erase(maxset.find(v[ind - k]));
else
minset.erase(find(minset.begin(), minset.end(), v[ind - k]));
while (maxset.size() > minset.size() + 1)
{
minset.insert(*maxset.begin());
maxset.erase(maxset.begin());
}
while (maxset.size() < minset.size())
{
maxset.insert(*minset.begin());
minset.erase(minset.begin());
}

++ind;
}
if (k % 2 == 1) ans.push_back(*maxset.begin());
else ans.push_back(1.0 * (*maxset.begin() + *minset.begin()) / 2);

//add left
//check top(left) > top(right)
//delete
//check size(left) > size(right) + 1
//check size(right) > size(left)
return ans;
}
};

You might also like