首先定义了结果数组 res 和 multiset;
遍历输入中的每个元素;
如果 multiset 中的元素超过了 k 个,需要把滑动窗口最左边 i - k 位置元素从 multiset 中删除(multiset 自动维护有序性);
把遍历到的当前元素插入到 multiset 中(multiset 自动维护有序性);
如果当前的位置达到了下标 k - 1,说明滑动窗口中有 k 个元素,开始求滑动窗口的中位数。
class Solution {
public:
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
vector<double> res;
multiset<double> st;
for (int i = 0; i < nums.size(); ++i)
{
if (st.size() >= k)
st.erase(st.find(nums[i - k]));
st.insert(nums[i]);
if (i >= k - 1)
{
auto mid = st.begin();
std::advance(mid, k / 2);
if(k%2==0)
{
mid--;
res.push_back((*mid + *(++mid))/2 );
}
else
{
res.push_back(*mid);
}
}
}
return res;
}
};