[leetcode]Median of Two Sorted Arrays

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);
    }
};

你可能感兴趣的:(LeetCode,第k小)