即给定两个有序数组,寻找这个数集合的中位数。
如:[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)便可。spa
而在两个数组中寻找中位数,即经过两分猜想,验证,舍弃便可。code
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); } };
主要应用了二分查找思想。leetcode