1、题目
2、分析
(1)该题我一开始想了好久都没想出来,因为没想到用"findKth"即找到第k个最大,将问题分解为:总数为偶数或奇数来解决问题;而是将问题分解为数组A为偶数或奇数,数组B为偶数或奇数这四种情况来解决问题,把问题弄的很复杂。
(2)参考了网上的解法,知道了用”findKth“后;我想着A和B都取k/2或(k+ 1)/2个,这样的话: 若A[k/2 - 1] < B[k/2 -1],则A[k/2 -1]根据k的奇偶可能被排除也可能不被排除;而如果使用A取k/2个,B取k - k/2个,在上述条件下A{k/2 -1]肯定被排除。
3、代码
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int total = m + n;
if(total == 0)
return 0;
double ans;
if(total % 2 ){
ans = findKth(A,m,B,n,total/2 + 1);
}else
ans = (findKth(A,m,B,n,total/2) + findKth(A,m,B,n,total/2 + 1))/2.0;
return ans;
}
private:
int findKth(int* A, int m, int* B, int n, int k){
if(m > n){
return findKth(B,n,A,m,k);
}
if(m == 0)
return B[k-1];
if(k == 1)//如果将这句,放在“m == 0”之前,则会出现m=0,而访问A的错误情形
return min(A[0],B[0]);
int ia = min(k/2,m), ib = k - ia;
if(A[ia - 1] < B[ib -1]){
findKth(A + ia,m - ia,B,ib,k - ia);
}else if(A[ia - 1] > B[ib - 1]){
findKth(A,ia,B + ib,n - ib,k-ib);
}else
return A[ia -1];
}
};
4、时间复杂度分析:
程序在最坏条件下结束条件为:"m == 0"或"k==1",因此我们可以从变量m或k的变化来计算时间复杂度。变量k的变化为k-ia或k-ib:(1)当 m > k/2时,ia和ib约为k/2,因此k每次都变为原来的1/2。(2)当m < k/2时,要么m变为0程序结束,要么k = k -ib,而ib >k/2,;即此时或者程序终止,或者k的减少量在其1/2以上。