Median of Two Sorted 求兩個有序數組的中位數


中位數是把一個數的集合划分為兩部分,每部分包含的數字個數相同,並且一個集合中的元素均大於另一個集合中的元素。

因此,我們考慮在一個任意的位置,將數組A划分成兩部分。i表示划分數組A的位置,如果數組A包含m個元素,則划分位置有m+1種情況。因此,i的取值范圍是0~m。

當i=0時,表示left_A為空;當i=m時,表示right_A為空。

同理,我們也可以划分B數組:

我們把left_A和left_B放到一個集合中,把right_A和right_B放到一個集合中。

如果想要獲得中位數,要保證len(left_part)==len(right_part),並且max(left_part)<=min(right_part)。

因此,我們要尋找i,使其保證:

還要注意i=0,i=m,j=0,j=n的邊界條件處理。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> s(nums1);
        vector<int> l(nums2);
        int m=nums1.size();
        int n=nums2.size();
        if(nums1.size()>nums2.size())
        {
            l=nums1;
            s=nums2;
            m=nums2.size();
            n=nums1.size();
        }
        
        int i,j;
        int low=0;
        int high=m;
        int num1,num2;
        while(low<=high)    //這里是對分割位置i進行二分搜索
        {
            i=(low+high)/2;
            j=(m+n+1)/2-i;
            if(i>0 && j<n && s[i-1]>l[j])  //i應當減小
                high=i-1;
            else if(j>0 && i<m && l[j-1]>s[i])  //i應當增大
                low=i+1;
            else
            {
                if(i==0)
                    num1=l[j-1];
                else if(j==0)
                    num1=s[i-1];
                else
                    num1=max(s[i-1],l[j-1]);
                break;
            }
        }
        if((m+n)%2==1)
            return num1;
        if(i==m)
            num2=l[j];
        else if(j==n)
            num2=s[i];
        else
            num2=min(s[i],l[j]);
        return (num1+num2)/2.0;
    }
    
};

 


免責聲明!

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



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