LeetCode題解-----Median of Two Sorted Arrays


題目描述:

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)).

 

解題思路:

  本題要求求解的是兩個有序序列的中位數。本質上就是求兩個有序序列“第k小的數“的變形。假設兩個有序序列一個長為m,另一個長為n,則我們要求的就是第(m+n)/2+1個數,若m+n為偶數,則求的是第(m+n)/2和第(m+n)/2+1個數的平均數。

  接下來分析如何在O(log(m+n))的復雜度內求解第k個小的數。我們首先假設k為偶數並且兩個有序序列a,b的長度都大於k/2(邊界情況見代碼),比較a[k/2-1]和b[k/2-1]的大小:

1)若a[k/2-1]==b[k/2-1],則該值就是我們所要求的值,因為將a和b的前k/2個元素歸並后就獲得了a,b序列的前k個元素,並且a[k/2-1]和b[k/2-1]相等且在最末尾。

2)若a[k/2-1]<b[k/2-1],則a的前k/2個元素中並不包含我們所求的第k小的元素,因此我們可以將其舍棄,進而遞歸求解剩下這些元素的第(k-k/2)小的元素。

3)若a[k/2-1]>b[k/2-1],處理方法和情況2類似

 

復雜度分析:

我們在求解第k小的元素的每次遞歸的過程中,基本上每次都要舍棄接近k/2的元素,而k的初始值為(m+n)/2,因為算法的復雜度為O(log(m+n))

 

代碼:

int findkth(int* a,int aSize,int*b,int bSize,int k) {
    int aPos,bPos;
    if(aSize>bSize){//保證a始終是較短序列
        return findkth(b,bSize,a,aSize,k);
    }
    if(aSize==0){//如果序列a空了,則直接返回
        return b[k-1];
    }
    if(k==1){
        return a[0]<b[0] ? a[0] : b[0];
    }
    
    aPos = k/2<aSize ? k/2 : aSize;//如果a太短,則直接取a的末尾元素比較
    bPos = k-aPos;
    
    if(a[aPos-1]==b[bPos-1]){
        return a[aPos-1];
    }else if(a[aPos-1]<b[bPos-1]){
        return findkth(a+aPos,aSize-aPos,b,bSize,k-aPos);
    }else{
        return findkth(a,aSize,b+bPos,bSize-bPos,k-bPos);
    }
    
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    
    if((nums1Size+nums2Size)%2){
        return findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1)*1.0;
    }else{
        return (findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2)
            +findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1))/2.0;
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM