Median of Two Sorted Arrays

Median of Two Sorted Arrays 题解


题目描述

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)便可。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

相关文章
相关标签/搜索