Median of Two Sorted Arrays

There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).


MIT 的 two sorted array Median算法实现
1. 如果l > r,说明前一个array已经用完,需要在另一个array中寻找切点
2. i 为当前array指定区域(l ,r)的中点, j为另外一个array中的一个点,两个点的index加起来是(m+n)的一半 + 1(如果m+n为偶数,则 当前i和j共代表的节点数目是 (m+ n) / 2 + 1, 如果(m+ n)是奇数,则i,j共代表的节点数为(n+m)/2).   并且这里设定大小排列语义为 ....B[j]  , A[i], B[j + 1]....
3. 根据第二步计算的index和设定的语义(红色部分),如果A[i]小于B[j],或者大于B[j  + 1].则需要分别更新l或者r来继续二分查找A来找到一个A[k]使得上述红色语义满足;
4. 到了这里,说明红色语义已经满足,如果m + n是奇数,A[i]就是中间那个点,直接返回;
5.到了这里说明是偶数个数,median为A[i]和按照大小排列A[i]的前一个值(假设为X)得平均值, 这个X可能是A[i - 1],也可能是B[j],根据i,j的具体数值来判断走那条分支。




class Solution {
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        if (m > n) return findMedian(B, n, A, m, 0, n - 1);
        return findMedian(A, m, B, n, 0, m - 1);
    }
    
private:
    double findMedian(int A[], int m, int B[], int n, int l, int r) {
        if (l > r) return findMedian(B, n, A, m, max(0, (n + m) / 2 - m), min(n, (n + m) / 2));
        int i = l + ((r - l) >> 1);
        int j = (n + m) / 2 - i - 1;
        if (j >= 0 && A[i] < B[j]) return findMedian(A, m, B, n, i + 1, r);
        if (j < n - 1 && A[i] > B[j + 1]) return findMedian(A, m, B, n, l, i - 1);
        if ((n + m) & 0x1) return A[i];
        if (i > 0) return (double)(A[i] + max(A[i - 1], j >= 0 ? B[j] : INT_MIN)) / 2.0;
        return (double)(A[i] + B[j]) / 2.0;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值