题目:
https://leetcode-cn.com/problems/sliding-window-median/comments/
就是建个数组,每次移动就是移除一个(移除前用二分查找找到具体点),加上一个。其他没难度
代码:
public double[] medianSlidingWindow(int[] nums, int k) {
int len = nums.length;
double[] ans = new double[len - k + 1];
int[] sz = Arrays.copyOfRange(nums, 0, k);
Arrays.sort(sz);
if (k % 2 == 0) {
for (int i = 0; i < ans.length - 1; i++) {
ans[i] = (0.0 + sz[k / 2] + sz[k / 2 - 1]) / 2;
if (nums[i] == nums[i + k]) {
continue;
}
change(sz, nums[i], nums[i + k], k);
}
ans[ans.length - 1] = (0.0 + sz[k / 2] + sz[k / 2 - 1]) / 2;
} else {
for (int i = 0; i < ans.length - 1; i++) {
ans[i] = sz[k / 2];
if (nums[i] == nums[i + k]) {
continue;
}
change(sz, nums[i], nums[i + k], k);
}
ans[ans.length - 1] = sz[k / 2];
}
return ans;
}
private void change(int[] sz, int remove, int add, int len) {
int key = getKey(sz, remove, 0, len - 1);
if (add > remove) {
for (int i = key + 1; i < len; i++) {
if (sz[i] < add) {
sz[i - 1] = sz[i];
} else {
sz[i - 1] = add;
return;
}
}
sz[len - 1] = add;
} else {
for (int i = key - 1; i >= 0; i--) {
if (sz[i] > add) {
sz[i + 1] = sz[i];
} else {
sz[i + 1] = add;
return;
}
}
sz[0] = add;
}
}
private int getKey(int[] sz, int remove, int sta, int end) {
int middle = (sta + end) / 2;
if (sz[middle] == remove) {
return middle;
}
if (sz[middle] > remove) {
return getKey(sz, remove, sta, middle - 1);
} else {
return getKey(sz, remove, middle + 1, end);
}
}