【LeetCode 4】寻找两个有序数组的中位数

题目链接

【题解】

假设在两个有序的序列中找第k小的数字。 那么我们先定位第一个序列中的第k/2个数字(不足则取最边上的那个数字)记下标为i1 然后定位第二个序列中的第k/2个数字(同样不足则取最边上的那个数字)记下标为i2 如果a[i1]

【代码】

class Solution {
public:
    
    int n,m;
    
    double findkth(vector<int> &nums1,vector<int> &nums2,int l1,int r1,int l2,int r2,int k){
        if (l1>r1) return nums2[l2+k-1];        
        if (l2>r2) return nums1[l1+k-1];
        if (k==1) return min(nums1[l1],nums2[l2]);
        int temp = k/2;
        int i1 = l1+temp-1;
        int i2 = l2+temp-1;
        if (i1>r1) i1 = r1;
        if (i2>r2) i2 = r2;
        if (nums1[i1]<nums2[i2]){
            //把l1..i1全删掉
            return findkth(nums1,nums2,i1+1,r1,l2,r2,k-(i1-l1+1));
        }else{
            //把l2..i2全删掉
            return findkth(nums1,nums2,l1,r1,i2+1,r2,k-(i2-l2+1));
        }
    }
    
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        n = nums1.size();m = nums2.size();
        if ((n+m)%2==1){
            return findkth(nums1,nums2,0,n-1,0,m-1,(n+m+1)/2);
        }else{
            double temp = findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2);
            temp+=findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2+1);
            temp/=2;
            return temp;
        }
    }
};
posted @ 2019-11-01 21:22  AWCXV  阅读(213)  评论(0编辑  收藏  举报