思路是动态维护对顶堆,使用multiset代替堆,避免手动实现堆的删除。
class Solution {
public:
double find_median(multiset<int> &min, multiset<int> &max, int k){
if(k%2==0){
return ((double)*max.rbegin()+*min.begin())/2;
}else{
return *max.rbegin();
}
}
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
// 从数据流的中位数进阶过来
// 使用对顶堆,大根堆存前k/2的元素,小根堆存后k/2个元素
// 滑动窗口,需要对支持删除操作。
// STL里面的堆不支持删除元素,用multiset替代
// 定义上min总是比max多一个
multiset<int> max, min;
vector<double> res;
for(int i=0;i<k;i++){
max.insert(nums[i]);
}
for(int i=0;i<k/2;i++){
auto tmp = *max.