最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

[LeetCode] 480. Sliding Window Median

XAMPP下载 admin 890浏览 0评论
 Problem
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].

Note:
You may assume k is always valid, ie: k is always smaller than input array’s size for non-empty array.

Solution
class Solution {
//minHeap存大于median的数
//maxHeap存小于median的数
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b)->(b.compareTo(a)));
public double[] medianSlidingWindow(int[] nums, int k) {
int n = nums.length-k+1;
if (n <= 0) return new double[0];

double[] res = new double[n];

for (int i = 0; i <= nums.length; i++) {
if (i >= k) {
res[i-k] = getMedian();
remove(nums[i-k]);
}
if (i < nums.length) {
add(nums[i]);
}
}

return res;
}
private void add(int num) {
if (num < getMedian()) maxHeap.offer(num);
else minHeap.offer(num);
//保证minHeap总比maxHeap的size相等或多一个元素
if (maxHeap.size() > minHeap.size()) minHeap.offer(maxHeap.poll());
if (maxHeap.size() < minHeap.size()-1) maxHeap.offer(minHeap.poll());
}
private void remove(int num) {
if (num < getMedian()) maxHeap.remove(num);
else minHeap.remove(num);
if (maxHeap.size() > minHeap.size()) minHeap.offer(maxHeap.poll());
if (maxHeap.size() < minHeap.size()-1) maxHeap.offer(minHeap.poll());
}
private double getMedian() {
if (maxHeap.isEmpty() && minHeap.isEmpty()) return 0;
if (maxHeap.size() == minHeap.size()) return ((double) maxHeap.peek() + (double) minHeap.peek()) / 2.0;
else return (double) minHeap.peek();
}
}

转载请注明:XAMPP中文组官网 » [LeetCode] 480. Sliding Window Median

您必须 登录 才能发表评论!