中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。
例如:
[2,3,4]
,中位数是3
[2,3]
,中位数是(2 + 3) / 2 = 2.5
给你一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。
示例:
给出 nums = [1,3,-1,-3,5,3,6,7]
,以及 k = 3。
窗口位置 中位数 --------------- ----- [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
因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]
。
暴力法,双循环,主要难点在于维护一个长度为k的窗口。
class Solution {
public double[] medianSlidingWindow(int[] nums, int k) {
int n = nums.length;
double[] media = new double[n-k+1];
int i=0;
for(int l=0,r=k;r<=n;r++){
long[] window = new long[k];//int[] window = new int[k];使用int会报错,输入:[2147483647,2147483647] 2 输出:[-1.00000] 预期:[2147483647.00000]
for(int j=l; j<r;j++){ //核心在这个for循环,维护window
window[j-l] = nums[j];
}
Arrays.sort(window);
if(k%2 != 0)
media[i++] = window[k/2];
else
media[i++] = (double)(window[k/2] + window[(k-1)/2])/2;//注意数据类型转换
l++;
}
return media;
}
}