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
猜您想看
-
c#中怎么获取当前日期时间
获取当前日期时...
2023年07月04日 -
C++为什么不要为虚函数和它的覆盖函数设定不同的默认参数
一、为什么不要...
2023年05月22日 -
dreamweaver代码怎么排版
Dreamwe...
2023年07月23日 -
Anemometer中怎么可视化Mysql慢查询日志
1. 使用An...
2023年05月26日 -
云服务器中ssh key管理与github的配置方法是什么
云服务器中SS...
2023年07月20日 -
Java基础中继承相关的内容有哪些
一、什么是继承...
2023年05月25日