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
猜您想看
-
beanstalk有什么作用
简介Beans...
2023年07月23日 -
hadoop distcp是什么
什么是Hado...
2023年07月22日 -
MySQL数据库的备份恢复管理
MySQL数据...
2023年05月05日 -
怎样解决苹果手机无法正常启动的问题?
苹果手机无法正...
2023年04月27日 -
Java中New一个对象是个怎么样的过程
1. 分配内存...
2023年05月26日 -
hdfs如何扩容
1.HDFS扩...
2023年05月22日