Median of Two Sorted Arrays(找两个排序数组的中位数,二分法)

/**
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)).

题目大意:在两个已经按升序排好序的数组中找出他们的中位数
思路:用二分法,每次找出每个待判断数组部分的中位数,这里很容易拿到
      各自的中位数,只要取上下边界的一半就可以取到,时间复杂度为O(1);
      然后定义一个查找第K个数的函数。
      寻找思路:每次比较这两个数组的中位数,如果A[amid] > B[bmid],且
      A的前半段和B的前半段个数和比K大,说明这第K个数一定在A的前半段和整个
      B中;反过来,就在B的前半段和整个A中找。
      
       
*/

#include <iostream>
#include <stdlib.h>

using namespace std;

int findKthElement(int A[], int aBegin, int aEnd, int B[], int bBegin, int bEnd, int k){
    if(aBegin > aEnd)
       return B[bBegin + k -1];
    if(bBegin > bEnd)
       return A[aBegin + k -1];
       
    int aMid = (aBegin + aEnd) / 2;
    int bMid = (bBegin + bEnd) / 2;
    int len = aMid - aBegin + bMid - bBegin + 2;
    //如果两个半段的个数和比K大,说明必定在其中的一个前半段和另一个的整段中 
    if(len > k){
       if(A[aMid] > B[bMid])
          return findKthElement(A, aBegin, aMid - 1, B, bBegin, bEnd, k);   //在A的前半段和B整段找 
       else
          return findKthElement(A, aBegin, aEnd, B, bBegin, bMid - 1, k);   //在B的前半段和A整段找 
    } 
    //否则就说明,中位数小的那半段就必定k的范围内了,只需要剩下的数据中的第k-半段数量 个大小的即可  
    else {
       if(A[aMid] > B[bMid])
          return findKthElement(A, aBegin, aEnd, B, bMid + 1, bEnd, k-(bMid-bBegin + 1));  //在A整段和B的后半段找          
       else
          return findKthElement(A, aMid + 1, aEnd, B, bBegin, bEnd, k-(aMid-aBegin + 1));  //在B整段和A的后半段找 
    }
}

double findMedianSortedArrays(int A[], int m, int B[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        //奇数长度则返回中间一个,否则返回中间两个的平均值 
        if( (m+n) % 2 == 1)
          return findKthElement(A,0,m-1, B, 0, n-1, (m+n)/2 + 1);
        else {
          return  ((double)findKthElement(A,0,m-1, B, 0, n-1, (m+n)/2) + (double)findKthElement(A,0,m-1,B,0,n-1,(m+n)/2 + 1)) /2;
        }
}
    
int main()
{
    int A[1] = {1};
    int B[1] = {2};
    cout << findMedianSortedArrays(A,1,B,1) << endl; 
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值