?LeetCode刷題實戰(zhàn)480:滑動窗口中位數

示例? ? ? ? ? ? ? ? ? ? ? ? ?

解題
import java.util.Collections;
import java.util.PriorityQueue;
public?class?Solution?{
????public?double[] medianSlidingWindow(int[] nums, int?k) {
????????int?n = nums.length;
????????int?m = n - k + 1;
????????// 結果的尺寸
????????double[] res = new?double[m];
????????//兩個堆,一個最大堆,一個最小
????????PriorityQueuemaxHeap = new?PriorityQueue (k, Collections.reverseOrder());
????????PriorityQueueminHeap = new?PriorityQueue (k);
????????for?(int?i = 0; i????????????int?num = nums[i];
????????????// 讓maxHeap始終保存小于一半的值,minHeap保存大于一半的,正好兩半
????????????if( maxHeap.size() == 0?|| maxHeap.peek() >= num) maxHeap.add(num);
????????????else?minHeap.add(num);
????????????// 維護兩個堆,保證兩個堆得大小,要么保持一致(偶數時),要么maxHeap多一個(奇數時)
????????????if( minHeap.size() > maxHeap.size() ) maxHeap.add(minHeap.poll());
????????????if( maxHeap.size() > minHeap.size() + 1?) minHeap.add(maxHeap.poll());
????????????// 如果需要輸出
????????????if?( i-k+1?>=0?){
????????????????if( k % 2?== 1?) res[i- k + 1] = maxHeap.peek();
????????????????else?res[i- k + 1] = (maxHeap.peek()/2.0?+ minHeap.peek()/2.0);
????????????????// 小心溢出
????????????????// 移除并更新
????????????????int?toBeRemove = nums[i - k + 1];
????????????????if( toBeRemove <= maxHeap.peek()) maxHeap.remove(toBeRemove);
????????????????else?minHeap.remove(toBeRemove);
????????????????// 維護兩個堆,保證兩個堆得大小,要么保持一致(偶數時),要么maxHeap多一個(奇數時)
????????????????if( minHeap.size() > maxHeap.size() ) maxHeap.add(minHeap.poll());
????????????????if( maxHeap.size() > minHeap.size() + 1?) minHeap.add(maxHeap.poll());
????????????}
????????}
????????return?res;
????}
}
LeetCode刷題實戰(zhàn)462:最少移動次數使數組元素相等 II
LeetCode刷題實戰(zhàn)465:最優(yōu)賬單平衡
LeetCode刷題實戰(zhàn)467:環(huán)繞字符串中唯一的子字符串
LeetCode刷題實戰(zhàn)470:用 Rand7() 實現 Rand10()
LeetCode刷題實戰(zhàn)471:編碼最短長度的字符串
