使用二分法(分治思想)来解决这个问题,对于两个长度分别为 m m 和 的数组,其时间复杂度为 log(m+n) l o g ( m + n ) 。假设找出其中第 k k 个元素,设在第一个数组中查找 个元素,在第二个数组中查找 q q 个元素,那么可得 ,因此问题变成在一个数组中确定 p p 的值大小的问题。代码实际在做的是一个二分 的过程。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int length = nums1.size() + nums2.size();
if(length % 2 == 0){
return (findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), length / 2) +
findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), length / 2 + 1)) / 2.0f;
}else{
return findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), (length + 1) / 2);
}
}
private:
int findKth(vector<int>& nums1, vector<int>& nums2, int start1, int len1, int start2, int len2, int k){
//保证第一个数组的元素个数小于第二个数组
if(len1 > len2){
return findKth(nums2, nums1, start2, len2, start1, len1, k);
}
//第一个数组的元素为0
if(len1 == 0)
return nums2[start2 + k - 1];
//只寻找一个元素时
if(k==1)
return min(nums1[start1], nums2[start2]);
int p = min(k/2, len1);
int q = k - p;
if(nums1[start1 + p - 1] > nums2[start2 + q - 1]){
//说明nums2 中的 q 个元素均在前 k 个元素中
return findKth(nums1, nums2, start1, len1, start2 + q, len2 - q, k - q);
}else if(nums1[start1 + p - 1] < nums2[start2 + q - 1]){
return findKth(nums1, nums2, start1 + p, len1 - p, start2, len2, k - p);
}else{
return nums1[start1 + p - 1];
}
}
};
思路和代码参考 简书上的一篇文章