[LeetCode]Median of Two Sorted Arrays

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以上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值