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
猜您想看
-
如何在宝塔面板中配置防盗链?
如何在宝塔面板...
2023年04月16日 -
MYSQL 8如何定住你的set variables
1. 什么是S...
2023年05月26日 -
油猴脚本开发技巧:使用 RxJS 处理事件流
使用 RxJS...
2023年05月13日 -
如何在Linux中配置回滚机制?
Linux下如...
2023年04月15日 -
DTO服务实现中的核心数据是什么
核心数据是指在...
2023年07月23日 -
如何利用网易云音乐的小窍门创建让你自己震撼的场景?
1.利用网易云...
2023年05月15日