4. 寻找两个正序数组的中位数
问题
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
分析
代码
目前实现了灵神的第一种解法。复杂度O(n),事实上,vector的insert就已经O(n)了。
class Solution {
public:
double findMedianSortedArrays(vector<int>& a, vector<int>& b) {
if (a.size() > b.size()) {
swap(a, b); // 保证a长度小于b
}
int m = a.size(), n = b.size();
a.insert(a.begin(), -1e9-10);
b.insert(b.begin(), -1e9-10);
a.push_back(1e9+10);
b.push_back(1e9+10);
// 不妨设总数奇数时,a比b多一个数
// i, j满足i+j=(m+n+1)/2
// 中位数:可以将一堆数字分为两组,总有第一组的最大值小于第二组的最小值
// i和j是第一组的有边界(包含)
for (int i = 0, j = (m+n+1)/2; ;) {
// 假设b[j+1]是第二组的最小值,需大于第一组的最大值a[i]或者b[j],但是有b[j+1] >= b[j]恒成立
// 也可能a[i+1]是第二组的最小值
if (a[i] <= b[j+1] && a[i+1] >= b[j]) {
int max1 = max(a[i], b[j]);
int min2 = min(a[i+1], b[j+1]);
if ((m+n) % 2 != 0) {
return max1;
} else {return (max1+min2) / 2.0;}
}
i++; j--;
}
}
};

浙公网安备 33010602011771号