[LeetCode] 4.Median of Two Sorted Arrays

原题链接:Median of Two Sorted Arrays
题目大意是,给你两个已经排好序的数组,找到这两个数组的中位数
比如:

Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0

又比如:

Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

问题可以延伸为求第k大数组元素的问题。

我们假设有数组A[]和B[],它们都是递增排列,假设它们的数组元素个数分别为n,m;那么
如果n+m为奇数,k=(n+m)/2+1,
如果n+m为偶数,只需第k=(n+m)/2和k=(n+m)/2+1大的元素的平均数
举个例子:

//数组元素个数为奇数
[1,2,3,(4),5,6,7],中位数是第k=7/2+1=4的元素,返回array[4]
//数组元素个数为偶数
[1,2,(3,4),5,6],中位数是第k=7/2=3和k=7/2+1=4元素的平均值,返回(array[3]+array[4])/2

因此在求中位数时,我们只需要看n+m的奇偶即可,然后通过调用函数findKth函数,进行求解

现在我们来讨论findKth函数的实现

在A,B数组中,为避免不必要的麻烦,我们始终把A数组视作数组元素个数较小的那个,即n < m;

1.显然,如果A的数组长度为n=0,直接返回B数组中的B[k-1]即可
2.如果k=1,返回min(A[0],B[0]);
3.判断判断k/2和n的大小,取pa=min(k/2,n),pb=k-pa;
如果A中第pa大的元素小于B中pb大的元素,那么自然,第k大的元素不在pa的左边,cut掉左边的k/2(或n,下同)个元素
同理,如果大于,cut掉B的左边k-pa个元素
如果相等,查找成功,返回该元素即可

注解:为什么会有第3点的那个结论呢?
我们不妨假设此时A[pa-1] < B[pb-1],此时A中pa大的元素(即A[pa-1])左边,加上本身,都是小于B[pb-1]的,总共有k/2个,而B[pb-1]左边有k/2-1个,总共有k-1个元素小于B[pb-1],那么,是否B[pb-1]就是第k大的元素呢?显然不是的,该B[pb-1]虽然大于左边的k/2和k/2+1个元素,但是不能保证A数组中A[pa-1]的右边的值,是否一定大于B[pb-1],换句话说,A[pa-1]的右边可能存在某值,小于B[pb-1],因此,需要进行下一轮迭代。通过这样,我们也可以想到为什么也不能cut掉B中B[pb-1]左边的部分,因为不能保证这些元素和A[pa-1]右边元素的大小,例如A[]={1,1,1,1},B[]={2,3,4,5},pa=pb=2。
那么,我们如何能确定第k个元素一定不在A中的左边k/2个里面呢。想想最坏的情况也不过是A中这k/2元素比B中这k/2-1元素大吧,最大也不过是k/2+k/2-1=k-1,显然达不到第k个元素,也即是说,第k大的元素可能存在于(1).A[k/2-1]的右边;(2)B中任何一个元素。

经过上面的分析,我们讨论一下它的复杂度,注意到这里k~=(m+n)/2,每次进行递归时,会cut掉k/2,复杂度近似为为log(m+n)。
如果A,B长度相差悬殊,这意味着含有较大的概率在第一次cut时,就全部cut掉长度较短的数组,考虑一个极端最好的情况是,n=0,此时时间复杂度为O(1);
如果A,B长度相近,这可能意味着需要多次进行cut,含有较大的复杂度,考虑最坏的情况,m=n;此时k~=n,每次递归,cut掉n/2(每次的长度不同),复杂度近似为logn ;

//findKth函数,返回A,B数组元素第k大的元素
double findKth(int A[],int B[],int n,int m,int k)

具体实现

double findKth(int A[],int B[],int n,int m,int k)
{
    if(n>m) return findKth(B,A,m,n,k);//保证n<=m
    if(n==0) return B[k-1];
    if(k==1) return min(A[0],B[0]);
    int pa=min(k/2,n),pb=k-pa;
    if(A[pa-1]<B[pb-1])
        return findKth(A+pa,B,n-pa,m,k-pa);
    else if(A[pa-1]>B[pb-1])
        return findKth(A,B+pb,n,m-pb,k-pb);  
    else  
        return A[pa-1];
}  

reference : Leetcode 4 Median of Two Sorted Arrays

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值