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

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5
分析

找到兩個有序數組的中位數,利用尋找兩個有序數組中的第k個數和二分思想進行查找,每次比較可以拋棄一半長度的數組。

class Solution {
public:
    double find(vector<int>& nums1, vector<int>& nums2,int nums1_beg,int nums1_end,int nums2_beg,int nums2_end,int k){//尋找兩個排序數組的第k個數
        int nums1_mid=(nums1_beg+nums1_end)/2;//先計算得到各自的中間位置
        int nums2_mid=(nums2_beg+nums2_end)/2;
        if(nums1_beg>nums1_end)//如果nums1遍歷完,返回k在nums2中的下標位置
            return nums2[nums2_beg+k-1];
        if(nums2_beg>nums2_end)//反之返回在nums1中的下標位置
            return nums1[nums1_beg+k-1];
        if(nums1[nums1_mid]<=nums2[bmid]){//如果nums1的中間元素小於nums2的中間元素,根據k與二者前半部分元素個數進行判斷
            if(k<=(nums1_mid-nums1_beg)+(nums2_mid-nums2_beg)+1){//k小於二者前半部分元素,則拋棄nums2的後半部分,繼續找k的位置
                return find(nums1,nums2,nums1_beg,nums1_end,nums2_beg,nums2_mid-1,k);
            }
            else{//如果大於二者前半部分的元素個數,則拋棄nums1的前半部分,並令k減去這部分的長度,繼續找k的位置
                return find(nums1,nums2,nums1_mid+1,nums1_end,nums2_beg,nums2_end,k-(nums1_mid-nums1_beg)-1);
            }
        }
        else{
            if(k<=(nums2_mid-nums2_beg)+(nums1_mid-nums1_beg)+1){
                return find(nums1,nums2,nums1_beg,nums1_mid-1,nums2_beg,nums2_end,k);
            }
            else{
                return find(nums1,nums2,nums1_beg,nums1_end,nums2_mid+1,nums2_end,k-(nums2_mid-nums2_beg)-1);
            }
        }
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size(),m=nums2.size();
        int k=(m+n+1)/2;//計算得出中位數是序列中的第k個數(從1開始算)
        if((m+n)%2==0){//如果序列之和爲偶數,則是第k個數和第k+1個數的平均數
            double l=find(nums1,nums2,0,n-1,0,m-1,k);
            double r=find(nums1,nums2,0,n-1,0,m-1,k+1);
            return (l+r)/2;
        }
        return find(nums1,nums2,0,n-1,0,m-1,k);
    }
};

詳細分析參考如下:

在兩個有序的數組中找第N個數,二分查找 O(lgm+lgn)級

Share my O(log(min(m,n)) solution with explanation


發佈了180 篇原創文章 · 獲贊 15 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章