Question:There are two sorted arrays nums1 and nums2 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)).
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
}
将本问题扩展为寻找两个有序序列的第k个数字。
所以有find_kth(int* nums1, int m, int* nums2, int n, int k )
注意:k从1开始计
所以有:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int total = nums1Size + nums2Size;
if(total & 0x1){//odd
return find_kth(nums1, nums1Size, nums2, nums2Size, total/2);
}
else{//even
return ( find_kth(nums1, nums1Size, nums2, nums2Size, total/2) + find_kth(nums1, nums1Size, nums2, nums2Size, (total/2)+1) )/2.0;
}
}
接下来的关键就是find_kth(int* nums1, int m, int* nums2, int n, int k )
怎么实现??
//
// main.cpp
// leetcode
//
// Created by YangKi on 15/11/06.
// Copyright © 2015年 YangKi. All rights reserved.
//
#include<cstdlib>
#include<iostream>
using namespace std;
int min(int a, int b)
{
return a<b? a : b;
}
int find_kth(int* A, int m, int* B, int n, int k)//k>=1
{
if (m>n) return find_kth(B, n, A, m, k);
if (m==0) return B[k-1];
if (k==1) return min(A[0], B[0]);
//首先,是不能确定A的m大于k/2的,但能确定B的n一定大于k/2
int ia=min(m, k/2); //所以ia有两种取值
int ib = k-ia;//对应的ib希望能与ia凑出k个,则相应也有两个取值,这样每次两者的末尾才对应于第k个
if (A[ia-1] < B[ib-1])
{
return find_kth(A+ia, m-ia, B, n, k-ia);// 因为此时已经删了ia个肯定是属于前k-1个的数字,则总的任务变成了找第k-ia大的数字
}
else if( A[ia-1] > B[ib-1] )
{
return find_kth(A, m, B+ib, n-ib, k-ib);
}
else
{
return A[ia-1];
}
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
int total = nums1Size + nums2Size;
if(total & 0x1)
{//odd
return find_kth(nums1, nums1Size, nums2, nums2Size, total/2+1);
}
else
{//even
return ( find_kth(nums1, nums1Size, nums2, nums2Size, total/2) + find_kth(nums1, nums1Size, nums2, nums2Size, (total/2)+1) )/2.0;
}
}
int main()
{
int A[3]={1,2,3};
int B[5]={4,5,6,7};
printf( "%lf\n", findMedianSortedArrays(A, 3, B, 4) );
return 0;
}