Median of Two Sorted Arrays

来源:互联网 发布:java形参 编辑:程序博客网 时间:2024/06/04 20:13

问题描述:There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

看到对时间复杂度的要求为对数级别,想到利用二分法,首先比较两个数组的中位数,假定m

class Solution {public:    double findMedian(vector<int>& nums,int start, int length){    if(length%2!=0)        return (double)nums[start+length/2];    else        return ((double)nums[start+length/2]+(double)nums[start+length/2-1])/2;}double findEqual(vector<int>& a, vector<int>& b, int aStart, int bStart, int la, int lb)  {      int divA = la/2;    int divB = lb/2;    //int l=divA<divB? dizA: divB;    if(la==1&&lb==1)    {        return ((double)a[aStart]+(double)b[bStart])/2;    }    if(la==1)    {        if(lb%2==0)        {            if(a[aStart]<b[bStart+divB-1])                return b[bStart+divB-1];            else if(a[aStart]>b[bStart+divB])                return b[bStart+divB];            return (double)a[aStart];        }        else        {            if(a[aStart]<b[bStart+divB-1])                return ((double)b[bStart+divB-1]+(double)b[bStart+divB])/2;            else if(a[aStart]<b[bStart+divB])                return ((double)a[aStart]+(double)b[bStart+divB])/2;            else if(a[aStart]>b[bStart+divB+1])                return ((double)b[bStart+divB]+(double)b[bStart+divB+1])/2;            else if(a[aStart]<b[bStart+divB+1])                return ((double)b[bStart+divB]+(double)a[aStart])/2;        }    }    double med_a=findMedian(a,aStart,la);    double med_b=findMedian(b,bStart,lb);    if(med_a==med_b)    {        return  findMedian(a,aStart,la);    }    else if(med_a<med_b)        return findEqual(a,b,aStart+divA,bStart,la-divA,lb-divA);    else        return findEqual(a,b,aStart,bStart+divA,la-divA,lb-divA);}double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {    int s1=nums1.size();    int s2=nums2.size();    if(s1==0||s2==0)        return (s1==0)? findMedian(nums2,0,s2):findMedian(nums1,0,s1);    if(s1<s2)        return findEqual(nums1,nums2,0,0,s1,s2);    else        return findEqual(nums2,nums1,0,0,s2,s1);}};
0 0
原创粉丝点击