Median of Two Sorted Arrays 题解
题目描述
即给定两个有序数组,寻找这个数集合的中位数。
如:[1,2] [3,4]
中位数为2.5
题解
有序数组A的大小为n,则中位数median满足
$$median = A[n / 2](n = 2k + 1)(公式1)$$
$$median = (A[(n - 1) / 2] + A[n / 2]) / 2 (n = 2k)(公式2)$$
观察可得出一个统一分支的情况,即将数组复制合并。A=A+A。如A=[1,2,3],那么复制加倍后得到A为[1,1,2,2,3,3]。则数组A的大小永远为偶数,则应用(公式2)即可。
而在两个数组中寻找中位数,即通过两分猜测,验证,舍弃即可。
代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& bigVec, vector<int>& smallVec) {
int m = bigVec.size(), n = smallVec.size();
if (m < n)
return findMedianSortedArrays(smallVec, bigVec);
int total = m + n;
m <<= 1; n <<= 1;
int left = 0, right = n;
do {
int midSmall = (left + right) >> 1, midBig = total - midSmall;
int leftBig = (midBig > 0? bigVec[(midBig - 1) >> 1] : smallVec.front());
int rightSmall = (midSmall < n? smallVec[midSmall >> 1] : bigVec.back());
if (leftBig > rightSmall) {
left = midSmall + 1;
continue;
}
int rightBig = (midBig < m? bigVec[midBig >> 1] : smallVec.back());
int leftSmall = (midSmall > 0? smallVec[(midSmall - 1) >> 1] : bigVec.front());
if (leftSmall > rightBig) {
right = midSmall - 1;
continue;
}
return ((double)max(leftBig, leftSmall) + min(rightBig, rightSmall)) / 2.0;
} while (left <= right);
return nan(NULL);
}
};
总结
主要应用了二分查找思想。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。