题目描述:
中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。
给你一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。
提示:
- 你可以假设 k 始终有效,即:k 始终小于输入的非空数组的元素个数。
- 与真实值误差在 10 ^ -5 以内的答案将被视作正确答案
例如:
- [2,3,4],中位数是 3
- [2,3],中位数是 (2 + 3) / 2 = 2.5
JAVA代码如下:
class Solution {
public double[] medianSlidingWindow(int[] nums, int k) {
int n = nums.length;
double[] arr = new double[n - k + 1];
int left = 0, right = 0;
int j = 0;
while (right < n) {
right++;
if (right - left == k && k % 2 != 0) {
int[] ints = new int[k];
int t = 0;
for (int i = left; i < right; i++) {
ints[t] = nums[i];
t++;
}
Arrays.sort(ints);
arr[j] = ints[k / 2];
j++;
left++;
}
if (right - left == k && k % 2 == 0) {
int[] ints = new int[k];
int t = 0;
for (int i = left; i < right; i++) {
ints[t] = nums[i];
t++;
}
Arrays.sort(ints);
arr[j] = ints[k / 2] / 2.0 + ints[- 1 + k / 2] / 2.0;
j++;
left++;
}
}
return arr;
}
}
执行结果: