版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Somnus_k/article/details/82428705
最简单的方法就是两个指针遍历两个数组,同时进行比较并计数,找到中位数,时间复杂度O(n)。
但是,这个方法并不是面试官想要的。于是会问,还有没有更快的方法,比O(n)更快的就只能想到O(logn)了,所以采用二分查找和分治算法来解决。
具体讲解参考:https://www.cnblogs.com/voidsky/p/5373982.html
将求中位数为题转化为TopK问题。
实现代码:
public class mid {
public static void main(String[] args) {
int[] num1 = {1,2,3};
int[] num2 = {4,5,6};
System.out.println(findMedianSortedArrays(num1,num2));
}
static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n =nums1.length;
int m = nums2.length;
if(n > m) //保证数组1一定最短
return findMedianSortedArrays(nums2,nums1);
int L1 = 0,L2 = 0,R1 = 0,R2 = 0,c1,c2,lo = 0, hi = 2*n; //我们目前是虚拟加了'#'所以数组1是2*n+1长度
while(lo <= hi) //二分
{
c1 = (lo+hi)/2; //c1是二分的结果
c2 = m+n- c1;
L1 = (c1 == 0)?Integer.MIN_VALUE:nums1[(c1-1)/2]; //map to original element
R1 = (c1 == 2*n)?Integer.MAX_VALUE:nums1[c1/2];
L2 = (c2 == 0)?Integer.MIN_VALUE:nums2[(c2-1)/2];
R2 = (c2 == 2*m)?Integer.MAX_VALUE:nums2[c2/2];
if(L1 > R2)
hi = c1-1;
else if(L2 > R1)
lo = c1+1;
else
break;
}
return ( Math.max(L1,L2)+ Math.min(R1,R2))/2.0;
}
}
结果:
3.5