对于这题不少人都用双堆,但是我想说c++是multiset自动升序排列时间复杂度是O(logn)
以下是c++代码解析:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @param k int整型
* @return double浮点型vector
*/vector<double> slidewindow(vector <int>& nums, int k) {
int n=nums.size();//找到初始数组个数
vector<double>arr;//创建记录结果数组
multiset<int>st;//创建multiset数组
int left=0;//int一个左边界
for(int i=0;i<k;i++)st.insert(nums[i]);//先往multset插入几个数字
auto mid=next(st.begin(),k/2);//定义一个中位数
if(k%2!=0)arr.push_back(*mid);//如果k是奇数插入答案中间数字
else
{
arr.push_back((*mid+*prev(mid))/2.0);//如果K是偶数插入答案中间左右数的平均数mid为靠右数
}
for(int right=k;right<n;right++)
{
st.insert(nums[right]);//往multset插入新数字,长度为k+1
if(nums[right]<*mid)mid--;//如果新插的数字小于原来的mid,往左移mid(不用担心k为奇数插入后mid靠左)
if(nums[left]<=*mid)mid++;//如果左指针小于mid往右移
st.erase(st.find(nums[left]));//删除左指针所指的,平衡长度k
left++;左指针右移
if(k%2!=0)arr.push_back(*mid);//插入答案
else
{
arr.push_back((*mid+*prev(mid))/2.0);
}
}
return arr;// write code here
}
};



京公网安备 11010502036488号