[leetcode]Median of Two Sorted Arrays

本文介绍了一种高效算法用于在两个已排序数组中找到第k小元素,并进一步计算两个数组的中位数。通过递归划分和比较策略,该算法在O(log(m+n))的时间复杂度内完成任务。
class Solution {
public:
    int findk(int *a,int *b,int lena,int lenb,int k){//找第k小
        int i=0,j=0;
        for(;(i<lena)&&(j<lenb);){
            --k;

            if(k==0){
                if(a[i]<b[j]){
                    return a[i];
                }else{
                    return b[j];
                }
            }else{
                if(a[i]<b[j]){
                    ++i;
                }else{
                    ++j;
                }
            }
            /*

            if(a[i]<b[j]){
                if(k==0){
                    return a[i];
                }
                ++i;
            }else if(k==0){
                return b[j];
            }else{
                ++j;
            }*/
        }
        return (i>=lena)?b[j+k-1]:a[i+k-1];
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();

        //奇偶分别处理
        return ((m+n)&1)?findk(&nums1[0],&nums2[0],m,n,(m+n+1)>>1):
        ((findk(&nums1[0],&nums2[0],m,n,(m+n)>>1)+findk(&nums1[0],&nums2[0],m,n,((m+n)>>1)+1))*.5);
    }
};
class Solution {//时间复杂度O(log(m+n))
public:
    int findk(int *a,int *b,int lena,int lenb,int k){//找第k小
        if(lena>lenb){//保证lena<=lenb
            return findk(b,a,lenb,lena,k);//交换
        }
        if(lena==0){
            return b[k-1];
        }
        if(k==1){
            return min(a[0],b[0]);
        }
        int pa=min(k>>1,lena);
        int pb=k-pa;
        return (a[pa-1]<b[pb-1])?findk(a+pa,b,lena-pa,pb,k-pa):findk(a,b+pb,pa,lenb-pb,k-pb);

    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();

        //奇偶分别处理
        return ((m+n)&1)?findk(&nums1[0],&nums2[0],m,n,(m+n+1)>>1):
        ((findk(&nums1[0],&nums2[0],m,n,(m+n)>>1)+findk(&nums1[0],&nums2[0],m,n,((m+n)>>1)+1))*.5);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值