Guest User

Untitled

a guest
Nov 21st, 2019
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. class Solution {
  2. private Queue<Integer> minHeap, maxHeap;
  3. public double[] medianSlidingWindow(int[] nums, int k) {
  4. minHeap = new PriorityQueue<>();
  5. maxHeap = new PriorityQueue<>(Collections.reverseOrder());
  6.  
  7. for(int j = 0; j < k; j++) {
  8. if(j == 0 || nums[j] <= maxHeap.peek()) {
  9. maxHeap.offer(nums[j]);
  10. }else {
  11. minHeap.offer(nums[j]);
  12. }
  13. }
  14. balance();
  15. double[] result = new double[nums.length - k + 1];
  16. int j = 0;
  17. result[j] = getMedianOfK(k);
  18. for(int i = k; i < nums.length; i++) {
  19. if(maxHeap.contains(nums[i-k])) {
  20. maxHeap.remove(nums[i-k]);
  21. } else {
  22. minHeap.remove(nums[i-k]);
  23. }
  24.  
  25. if(maxHeap.isEmpty() || nums[i] <= maxHeap.peek()) {
  26. maxHeap.offer(nums[i]);
  27. }else {
  28. minHeap.offer(nums[i]);
  29. }
  30. balance();
  31. result[++j] = getMedianOfK(k);
  32. }
  33. return result;
  34. }
  35. private void balance() {
  36. while(maxHeap.size() < minHeap.size()) {
  37. maxHeap.offer(minHeap.poll());
  38. }
  39. while(minHeap.size() < maxHeap.size() - 1) {
  40. minHeap.offer(maxHeap.poll());
  41. }
  42. }
  43. private double getMedianOfK(int k) {
  44. if(k % 2 == 0) {
  45. double a1 = (double)maxHeap.peek();
  46. double a2 = (double)minHeap.peek();
  47. return (a1 + a2) / 2.0;
  48. }
  49. return (double)maxHeap.peek();
  50. }
  51. }
Add Comment
Please, Sign In to add comment