给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 不同时为空。
示例 1:
nums1 = [1, 3] nums2 = [2] 中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5
经典面试题…其实也就是个基础二分…
int find_k_num(vector<int>& nums1, vector<int>& nums2, int l1, int r1, int l2, int r2, int k)
{
//cout << l1 << " " << r1 << " " << l2 << " " << r2 << " " << k << endl;
if ( l1 > r1 )
{
return nums2[l2 + k - 1];
}
if ( l2 > r2 )
{
return nums1[l1 + k - 1];
}
int mid1 = l1 + (r1 - l1)/2;
int mid2 = l2 + (r2 - l2)/2;
if (nums1[mid1] >= nums2[mid2] && (mid1 - l1 + 1) + (mid2 - l2 + 1) > k)
{
return find_k_num(nums1, nums2, l1, mid1 - 1, l2, r2, k);
}
else if (nums1[mid1] >= nums2[mid2] && (mid1 - l1 + 1) + (mid2 - l2 + 1) <= k)
{
return find_k_num(nums1, nums2, l1, r1, mid2 + 1, r2, k - (mid2 - l2 + 1) );
}
else if (nums1[mid1] < nums2[mid2] && (mid1 - l1 + 1) + (mid2 - l2 + 1) > k)
{
return find_k_num(nums1, nums2, l1, r1, l2, mid2 - 1, k);
}
else if (nums1[mid1] < nums2[mid2] && (mid1 - l1 + 1) + (mid2 - l2 + 1) <= k)
{
return find_k_num(nums1, nums2, mid1 + 1, r1, l2, r2, k - (mid1 - l1 + 1) );
}
return -1;
}
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size(), len2 = nums2.size(), len = len1 + len2;
if (len & 1)
{
return (double)find_k_num(nums1, nums2, 0, len1 - 1, 0, len2 - 1, len/2 + 1);
}
else
{
double ans1 = (double)find_k_num(nums1, nums2, 0, len1 - 1, 0, len2 - 1, len/2);
double ans2 = (double)find_k_num(nums1, nums2, 0, len1 - 1, 0, len2 - 1, len/2 + 1);
//cout << "ans1" << ans1 << endl;
//cout << "ans2" << ans2 << endl;
return (ans1 + ans2) * 0.5;
}
}
};