首选用堆,一般用两个堆来求解中位数。
class MedianFinder {
int count;
PriorityQueue<Integer> max;
PriorityQueue<Integer> min;
/** initialize your data structure here. */
public MedianFinder() {
count = 0;
max = new PriorityQueue<>((a,b)->b-a);
min = new PriorityQueue<>();
}
public void addNum(int num) {
count++;
max.offer(num);
min.offer(max.poll());
if(count % 2 == 1) max.offer(min.poll());
}
public double findMedian() {
if(count % 2 == 1){
return (double)max.peek();
}else{
return ((double)max.peek() + (double)min.peek()) * 0.5;
}
}
}
字节一面问到
讲解:https://zhuanlan.zhihu.com/p/70654378
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
if(len1 > len2) return findMedianSortedArrays(nums2, nums1);
int k = (len1 + len2 + 1)/2;
int left = 0, right = len1;
while(right >= left){
int i = left + (right-left)/2;
int j = k-i;
if(i < len1 && nums1[i] < nums2[j-1]) left = i+1;
else if(i > 0 && nums2[j] < nums1[i-1]) right = i-1;
else{
int max_of_left = -1, min_of_right = -1;
if(i == 0) max_of_left = nums2[j-1];
else if(j == 0) max_of_left = nums1[i-1];
else max_of_left = Math.max(nums1[i-1], nums2[j-1]);
if ((len1 + len2) % 2 == 1) return max_of_left;
if(i == len1) min_of_right = nums2[j];
else if(j == len2) min_of_right = nums1[i];
else min_of_right = Math.min(nums1[i], nums2[j]);
return (max_of_left + min_of_right) / 2.0;
}
}
return 0.0;
}
}