给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n))
时间: 2023-03-29 16:00:59 浏览: 98
中位数是指将一个集合分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。对于两个正序数组,可以将它们合并成一个有序数组,然后找到中位数。时间复杂度为 O(m+n)。
但是,如果要求时间复杂度为 O(log(m+n)),可以使用二分查找的思想。假设两个数组的长度分别为 m 和 n,将它们合并成一个有序数组,中位数的位置为 (m+n+1)/2。然后在两个数组中分别进行二分查找,找到第一个数组中第 k/2 个元素和第二个数组中第 k/2 个元素,比较它们的大小,如果第一个数组中的元素小于第二个数组中的元素,则说明中位数在第一个数组的右半部分和第二个数组的左半部分之间,否则在第二个数组的右半部分和第一个数组的左半部分之间。然后递归查找,直到找到中位数。
具体实现可以参考以下代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size();
if (m > n) return findMedianSortedArrays(nums2, nums1);
int iMin = , iMax = m, halfLen = (m + n + 1) / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2;
int j = halfLen - i;
if (i < iMax && nums2[j-1] > nums1[i]) {
iMin = i + 1;
} else if (i > iMin && nums1[i-1] > nums2[j]) {
iMax = i - 1;
} else {
int maxLeft = ;
if (i == ) maxLeft = nums2[j-1];
else if (j == ) maxLeft = nums1[i-1];
else maxLeft = max(nums1[i-1], nums2[j-1]);
if ((m + n) % 2 == 1) return maxLeft;
int minRight = ;
if (i == m) minRight = nums2[j];
else if (j == n) minRight = nums1[i];
else minRight = min(nums1[i], nums2[j]);
return (maxLeft + minRight) / 2.;
}
}
return .;
}
};
阅读全文