题目解析:
这个题目简单来说就是如果将两个已经排序的数组合并为一个虚拟数组,求出这个虚拟数组的中位数即可。
解题思路:
1、这道题最主要的就是切(cut),怎么将数组切成合适的两段是关键,对于一个数组来说在数组的中间将其切成两段,这时候就要分情况讨论,如果是偶数个,中位数就是切点的两边第一个数的平均值,如果是奇数个,中位数就是切点右边的第一个数,比如说1 2 3 4 5,在中间的位置将这个数组切成两段:1 2 \ 3 4 5,很显然,中位数就是3,如果是1 2 3 4,那么就切成了1 2 \ 3 4,很显然中位数就是(2+3)/2 = 2.5。
2、理解了切的思想,接下来就开始在两个数组中进行切,这时候就用到了分治思想。
怎么分?
题目中要求的时间复杂度为 O(log(m + n)),很容易想到的方法就是二分,现在有两个数组,要对那个数组进行二分合适?由于找的是中位数,那么这个数字的两边的元素个数是相等的,所以只需要确定一个数组中的两边元素,两一个数组的对应的补上去就可以了,为了提高效率,要选择最短的数组做二分查找。
怎么治?
这个也很容易,只需要分别比较两个数组切点两边的数就可以,假设数组一中切点两边的元素为L1,R1,数组二中切点两边的元素为:L2,R2,切完之后有三种情况:
1)L1>R2 ,说明数组一的左半边比数组二的右半边大,应该让cut向左移,才能使数组一中较