一、滑动窗口中位数的定义

滑动窗口中位数是指给定一个序列,比如[1,2,3,4,5],滑动窗口大小为3,即[1,2,3]、[2,3,4]、[3,4,5],每一个窗口中的中位数分别为2、3、4。

二、滑动窗口中位数的实现

要实现滑动窗口中位数,需要使用一个有序容器来存放窗口中的元素,比如使用multiset,这样可以让容器中的元素以升序排列。每次窗口滑动时,需要将新元素插入容器,并将最旧的元素从容器中删除,这样就可以保证容器中的元素为窗口中的元素。

容器中元素的个数可以是奇数也可以是偶数,当容器中元素的个数为奇数时,中位数就是容器中的第 (n+1)/2 个元素,当容器中元素的个数为偶数时,中位数就是容器中的第 n/2 个元素和第 (n+2)/2 个元素的平均值。

三、滑动窗口中位数的代码实现

#include <iostream>
#include <vector>
#include <set>

using namespace std;

// 计算滑动窗口中位数
double getSlidingWindowMedian(vector<int> &nums, int k) {
multiset<int> window(nums.begin(), nums.begin() + k);
auto mid = next(window.begin(), k / 2);
double median = ((double)*mid + *prev(mid, 1 - k % 2)) / 2;
for (int i = k; ; i++) {
if (i >= nums.size())
return median;
window.insert(nums[i]);
if (nums[i] < *mid)
mid--;
if (nums[i - k] > *mid)
mid++;
window.erase(window.lower_bound(nums[i - k]));
median = ((double)*mid + *prev(mid, 1 - k % 2)) / 2;
}
}

int main() {
vector<int> nums = {1, 2, 3, 4, 5};
int k = 3;
double median = getSlidingWindowMedian(nums, k);
cout << "The median of sliding window size " << k << " is: " << median << endl;
return 0;
}

输出结果:
The median of sliding window size 3 is: 3