做这题花了四个小时,学习到了使用二分查找,代码可以扩展至“在两个有序数组中找到第K个元素”。
因为有O(log(m+n))的要求,我们不能简单使用扫描数组然后取中位数的形式,这要求我们使用复杂度为log(n) 的二分查找。
梳理题目条件:不考虑特殊情况,且假设nums1 元素个数 小于 nums2,nums1 有n1个元素, nums2有n2个元素,k为 (n1 + n2 + 1) / 2,若数组为偶数个,则中位数为C[k-1],若为奇数个, 则中位数为C[k-1]和C[k] 取平均数。
我们从nums1中取m1个元素,nums2中自然取m2个元素,使得m1 + m2 = k 成立,其中k为 (n1 + n2 + 1) / 2。
二分查找要找的数应当是下图中最小的m1, 使得A[m1] > B[m2 - 1]。理由是: A[m1] 是nums1中下一个将被取到的数,B[m2 - 1] 是 nums2中最后一个取到的数,如果小了,说明nums1还要多取。
用例子来说明
代码:https://github.com/chy996633/leetcode/blob/master/src/MedianOfTwoSortedArrays.java