[Letcode/4]二次シードアレイ(Hard,Java)Median of


Question
  • 問題リンク:https://leetcode.com/problems/median-of-two-sorted-arrays/2
  • 分類:優先キュー
  • 解答時間:10分
  • 問題の説明
  • サイズnのnum 1とサイズmのnum 2の配列
  • この2つの配列の中央値を求めます
  • がちょうどずれている中心値がない場合(=2つの配列の長さは偶数)、中心に近い両端値を返す平均値は
  • である.
  • 時間複雑度O(対数(n+m)O(対数(n+m)O(対数(n+m)
  • )
    Solution
    プールアクセス方法
  • は、2つの優先キューでソートされます.
  • 中央、小値優先キュー:降順配列
  • 中央キュー、大値キュー:昇順
  • の2つの優先順位キューの上部の値は、中心値
  • を自動的に表す.
    正しいコード
    import java.util.*;
    
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            PriorityQueue<Integer> minQueue = new PriorityQueue<Integer>(Collections.reverseOrder());
            PriorityQueue<Integer> maxQueue = new PriorityQueue<Integer>();
            
            for (int i = 0; i < nums1.length; i++) {
                // 큐에 들어가 있는 숫자의 개수에 따라 번갈아서 넣어 줌
                if (maxQueue.size() < minQueue.size()) {
                    maxQueue.add(nums1[i]);
                } else {
                    minQueue.add(nums1[i]);
                }
                
                if (!minQueue.isEmpty() && !maxQueue.isEmpty()) {
                    // 큰 값이 들어가있는 큐의 제일 작은 값이, 작은 값이 들어가있는 큐의 제일 큰 값보다 작을 경우
                    // 둘을 바꿔서 넣어줌
                    if (minQueue.peek() > maxQueue.peek()) {
                        int temp = minQueue.poll();
                        minQueue.add(maxQueue.poll());
                        maxQueue.add(temp);
                    }
                }
            }
            
            for (int i = 0; i < nums2.length; i++) {
                if (maxQueue.size() < minQueue.size()) {
                    maxQueue.add(nums2[i]);
                } else {
                    minQueue.add(nums2[i]);
                }
                
                if (!minQueue.isEmpty() && !maxQueue.isEmpty()) {
                    if (minQueue.peek() > maxQueue.peek()) {
                        int temp = minQueue.poll();
                        minQueue.add(maxQueue.poll());
                        maxQueue.add(temp);
                    }
                }
            }
            
            // 딱 떨어지는 중앙값 없으면, 양 옆 숫자의 평균 리턴
            if(maxQueue.size() == minQueue.size()) {
                return (maxQueue.poll() + minQueue.poll()) / 2.0;
            } else if (maxQueue.size() > minQueue.size()) {
                return (double) maxQueue.poll();
            } else {
                return (double) minQueue.poll();
            }
            
        }
    }