/**
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;
}
Median of Two Sorted Arrays(找两个排序数组的中位数,二分法)
最新推荐文章于 2020-06-02 19:14:49 发布