Question
문제 해설
- 크기가 n인 num1와 크기가 m인 num2인 배열이 주어진다
- 이 두 배열 값의 중앙 값을 구하여라
- 딱 떨어지는 중앙값이 없을 경우(= 두 배열을 합친 길이가 짝수일 때), 중앙에 가까운 양 쪽 값의 평균값으로 리턴
- 시간 복잡도는 O(log(n+m)
Solution
풀이 접근 방법
- 두개의 우선순위 큐로 나누어서 수 정렬
- 중앙 기준, 작은 값을 담는 우선순위 큐 : 내림차순 정렬
- 중앙 기준, 큰 값을 담는 우선순위 큐 : 오름차순 정렬
- 두 우선순위 큐의 맨 위에 있는 값들은 자동적으로 중앙 값을 표현하고 있음
정답 코드
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();
}
}
}