4. Median of Two Sorted Arrays
问题描述
求两个有序的数组合并后的中位数
思路
主要思路就是从两个数组数组头开始提取元素,然后比较大小,将较小者存入新数组,继续取一个元素然后重复比较,选较小的放入新数组。直到其中达到了中位数的位置或者一个已经空了,那就直接从另一个取元素直到中位数位置。
1 如果某数组为空,则返回另一个数组的中位数
2 如果两者都不为空:
那么比较两个数字的数组头元素
将其中较小的取出
重复比较到达了中位数位置或者一个已经空了
代码
#include <iostream>
#include <vector>
using namespace std;
/*
* Median of Two Sorted Arrays
* The overall run time complexity should be O(log (m+n)).
*/
/**
* 先分几种情况讨论下
* 1. 其中某个是空数组,返回另一个数组中间值
* 2. 比较两个数组现在的元素,从相对较小的数组中拿取一个,重复进行,一共拿取(m + n) / 2 + 1个,若中途某数组结束,则无需比较直接从另一数组拿取
* 最后按照n + m是否是奇数来输出不同的模式
*/
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.empty()) {
return nums2.size() % 2 != 0 ? nums2[nums2.size() / 2] : (double)(nums2[nums2.size() / 2 - 1] + nums2[nums2.size() / 2]) / 2;
}
if (nums2.empty()) {
return nums1.size() % 2 != 0 ? nums1[nums1.size() / 2] : (double)(nums1[nums1.size() / 2 - 1] + nums1[nums1.size() / 2]) / 2;
}
int len = nums1.size() + nums2.size();
bool odd = len % 2 != 0;
int target = 0;
int lastone = 0;
int i = 0, j = 0;
while (i + j < (double)len / 2 + 1) {
lastone = target;
if (i >= nums1.size()) {
j++;
target = nums2[j - 1];
continue;
}
if (j >= nums2.size()) {
i++;
target = nums1[i - 1];
continue;
}
if (nums1[i] < nums2[j]) {
i++;
target = nums1[i - 1];
} else {
j++;
target = nums2[j - 1];
}
}
if (odd) {
return lastone;
} else {
return (double)(target + lastone) / 2;
}
}
};