博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
480. Sliding Window Median
阅读量:4693 次
发布时间:2019-06-09

本文共 1712 字,大约阅读时间需要 5 分钟。

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

Examples: 

[2,3,4] , the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Your job is to output the median array for each window in the original array.

For example,

Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Median---------------               -----[1  3  -1] -3  5  3  6  7       1 1 [3  -1  -3] 5  3  6  7       -1 1  3 [-1  -3  5] 3  6  7       -1 1  3  -1 [-3  5  3] 6  7       3 1  3  -1  -3 [5  3  6] 7       5 1  3  -1  -3  5 [3  6  7]      6

Therefore, return the median sliding window as [1,-1,-1,3,5,6].

主要思路:维护一个大小为k的集合,并且在插入和删除的时候都调整mid的位置,使之最后仍能指向k/2的位置。

1 class Solution { 2 public: 3     vector
medianSlidingWindow(vector
& nums, int k) { 4 multiset
window(nums.begin(),nums.begin()+k); 5 auto mid=next(window.begin(),k/2); 6 vector
ans; 7 for(int i=k;;i++){ 8 ans.push_back((double(*mid)+*next(mid,k%2-1))/2); 9 if(i==nums.size())return ans; 10 window.insert(nums[i]);11 if(nums[i]<*mid)mid--;//add12 13 if(nums[i-k]<=*mid)mid++;//before delete14 window.erase(window.lower_bound(nums[i-k]));15 }16 }17 };

 

转载于:https://www.cnblogs.com/tsunami-lj/p/6419682.html

你可能感兴趣的文章
const与指针
查看>>
thsi指针的一些用法及作用
查看>>
c++友元
查看>>
c++运算符重载
查看>>
一元运算符重载
查看>>
c中的malloc函数
查看>>
c++继承中的对象模型
查看>>
c++中的new和delete
查看>>
c++继承中同名成员处理
查看>>
值传递,引用传递,指针传递
查看>>
浅拷贝和深拷贝
查看>>
结构体嵌套一个例子
查看>>
虚析构和纯虚析构
查看>>
空对象占用的内存空间
查看>>
构造函数调用规则
查看>>
基类成员访问方式
查看>>
编译安装MySQL
查看>>
expect脚本远程登录、远程执行命令和脚本传参简单用法
查看>>
隐藏Apache版本号及版本敏感信息
查看>>
pssh安装及使用
查看>>