题目
给定两个大小为 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
思路
求奇数个数字的中位数,(size1 + size2 + 1) / 2)=(size1 + size2 + 2) / 2)。
求奇数个数字的中位数,(size1 + size2 + 1) / 2)为二分点的前一个数,(size1 + size2 + 2) / 2)为二分点的后一个数。
例如
一共五个数, 则需要从小到大搜索,搜索到第三个数必然为中位数。
一共六个数, 则需要分别搜索第三个和第四个数,两数求和为中位数。
程序中的mid可以理解为中位数所在的位置,也可理解为需要搜索的次数,并且逐步减1.
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int size1 = nums1.size(), size2 = nums2.size();
auto mid1 = findMid(nums1, nums2, (size1 + size2 + 1) / 2);
auto mid2 = findMid(nums1, nums2, (size1 + size2 + 2) / 2);
return (mid1 + mid2) / 2;
}
double findMid(vector<int>& nums1, vector<int>& nums2, int mid)
{
int size1 = nums1.size(), size2 = nums2.size();
int b1 = 0, b2 = 0, value = 0;
while (mid--)
{
if (b1 == size1)
return nums2[b2 + mid];
if (b2 == size2)
return nums1[b1 + mid];
else if (b1 < size1 && b2 < size2)
{
value = nums1[b1] < nums2[b2] ? nums1[b1++] : nums2[b2++];
}
}
return value;
}
};