—— Median of Two Sorted Arrays

时间:2023-02-05 12:22:19

4、 Median of Two Sorted Arrays

两个排序数组的中位数

两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。

样例

给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5

给出数组A = [1,2,3] B = [4,5],中位数 3

挑战 

时间复杂度为O(log n)

具体思路:

求第k个元素,取A[k / 2] B[k / 2] 比较,如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中,

反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,然后使用递归,直到找到k为止。


代码:

class Solution {
public:
    double findkth(vector<int>& A,vector<int>& B,int A_start,int B_start,int median)
    {
        //边界情况,当一边为空时,直接从另一边取元素
        if(A_start>=A.size())
            return B[B_start+median-1];
        if(B_start>=B.size())
            return A[A_start+median-1];
        //当k为1时,直接取最小值
        if(median==1)return min(A[A_start],B[B_start]);
        //A,B都向前走中位数的一半,相互比较,小的一方说明必然不包含所求的元素
        int A_key=A_start+median/2-1>=A.size()?INT_MAX:A[A_start+median/2-1];
        int B_key=B_start+median/2-1>=B.size()?INT_MAX:B[B_start+median/2-1];
        if(A_key<B_key)//比较,小的一方向前移动,median也减去相应的数量
            return findkth(A,B,A_start+median/2,B_start,median-median/2);
        else
            return findkth(A,B,A_start,B_start+median/2,median-median/2);
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int sum=nums1.size()+nums2.size();
        double reulst;
        if(sum&1)//sum是否为2的倍数,是有两个中位数
            return reulst=findkth(nums1,nums2,0,0,sum/2+1);
        else
            return reulst=(findkth(nums1,nums2,0,0,sum/2)+findkth(nums1,nums2,0,0,sum/2+1))/2;
    }
};