给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。用新数组接受两个数组的元素
时间: 2023-12-06 17:45:30 浏览: 58
寻找两个正序数组的中位数 .md
要找出两个有序数组的中位数,可以将两个数组合并成一个有序数组,然后找出中位数即可。
合并两个有序数组可以使用双指针法,将两个数组中的元素比较大小后,按顺序加入新的数组中。具体实现可以参考以下代码:
```
vector<int> mergeArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) {
res.push_back(nums1[i]);
i++;
} else {
res.push_back(nums2[j]);
j++;
}
}
while (i < nums1.size()) {
res.push_back(nums1[i]);
i++;
}
while (j < nums2.size()) {
res.push_back(nums2[j]);
j++;
}
return res;
}
```
接下来就可以通过新的数组找到中位数了。如果新数组长度为偶数,则中位数为中间两个数的平均值;如果长度为奇数,则中位数为中间的那个数。具体实现可以参考以下代码:
```
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums = mergeArrays(nums1, nums2);
int n = nums.size();
if (n % 2 == 0) {
return (nums[n/2-1] + nums[n/2]) / 2.0;
} else {
return nums[n/2];
}
}
```
时间复杂度为 O(m+n),无法满足题目要求的 O(log(m+n))。如果要满足要求,可以使用二分查找。不过这里就不再详细讲解了。
阅读全文