原始题目
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
意思是给定了两个已经排序的数组大小分别为m和n,在O(log(m+n))的时间复杂度下,找到他们的中位数。
你可以假设两个数组不同时为空。
当看到这个题目的时候,我相信很多人的想法和我一样,是合并两个数组,排序,找到其中位数。几乎没有任何犹豫,不过后来一提交,超时!
这种最最简单的方法的时间复杂度为O(nlogn);显然大于了题目的要求。于是我想到了二分法,大家都知道二分法的时间复杂度是O(logn)。
首先我们要明白中位数的真正意义是将一个数组分为左右相等的两个部分,假设一个数组有n个数字,那么中+位数就是其第(n+1)/2小数字。即:【1,2,3,4,5,6,7】 n=7, median=(7+1)/ 2=4;
left_A | right_A
A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1]
那么在两个数组中,
left_part | right_part
A[0], A[1], ..., A[i-1] | A[i], A[i+1], ..., A[m-1]
B[0], B[1], ..., B[j-1] | B[j], B[j+1], ..., B[n-1]
※真正的中位数会在两个数组分别的中位数附近!所以我们先分别求出两个数组的中位数i和j(其实j是根据i出来的),然后比较A [ i - 1 ] < = B [ j ] and B [ j - 1 ] < = A [ i ],通过控制 i 来寻找,left_part多了 i- -,left_part少了,就i++,
※那么,我们要做的事情就是!!!找到一个满足条件的 i !!!!满足 A [ i - 1 ] < = B [ j ] and B [ j - 1 ] < = A [ i ] ,那么说明这两个数组已经被均分了即left_part元素个数=right_part元素个数,即中位数就是*MAX ( A[ i - 1 ] , B [ j - 1 ] )
直接上代码!
public static double soluiton(int[] A , int[] B) {
int m=A.length;
int n=B.length;
if(m>n) {
//ensure m<=