题目
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。找出这两个有序数组的中位数。要求算法的时间复杂度为O(log(m+n))。
示例
题解
整体上是一个分而治之的思想,将问题分解,使用递归可以很方便的完成。这个问题是『寻找两个有序数组中的第 k 大元素』问题的特殊形式,我们直接实现寻址第 k 大元素的函数 find_kth() 即可,然后在 findMedianSortedArrays() 中调用它即可。
我们使用递归方式实现 find_kth(),对于递归算法,我们要注意递归终止条件。首先要确保第一个参数数组的长度是较短的,
- 较短数组
a的长度(未搜索区域长度)变为 0,返回b中第k个元素; - 待寻找的序数
k = 1,返回a和b的第一个元素中的较小者。
然后我们需要确定每个数组的搜索长度。对于较小数组 a,搜索长度为数组长和 k/2 的较大者,余下的长度则为数组 b 待搜索的长度。
代码如下:
1 | // 辅助函数 选择两个有序数组中第 k 大的数 |