leetcode如何找出滑动窗口中位数
一、滑动窗口中位数的定义
滑动窗口中位数是指给定一个序列,比如[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
猜您想看
-
MySQL规范知识有哪些
MySQL是一...
2023年07月22日 -
如何在Steam上找到和加入对应游戏的项目协作和创意工坊?
在Steam上...
2023年05月13日 -
C++的operator()怎么使用
什么是C++的...
2023年05月26日 -
JVM内存级分布式缓存Hazelcast的应用
1、Hazel...
2023年05月26日 -
如何解决Swagger+dubbo返回值ApiModelProperty注解说明不显示问题
一、Swagg...
2023年05月22日 -
mysql中show full processlist的阻塞分析
阻塞是MySQ...
2023年07月22日