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

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

题目描述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:

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

则中位数是 2.0
示例 2:

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

则中位数是 (2 + 3)/2 = 2.5

题目来源: LeetCode

解题思路:
两个有序数组合并,并直接求取合并数组的中位数(时间和空间效率不高,但比较容易理解,并且复习一下归并排序)

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
  /*相当于两个有序子数组进行归并排序,再对排好序的数组寻找中位数*/
    int allLength = nums1.size() + nums2.size();//用于寻找合并后数组的中位数
    vector<int> result(allLength, 0);
    Merge(nums1, nums2, result);
    float ret = (allLength%2==0)? (result[allLength/2]+result[allLength/2-1])/2.0 : result[allLength/2];
    return ret;
}

void Merge(vector<int>& A, vector<int>& B, vector<int>& result){
    int i = 0;
    int m = A.size() -1; 
    int n = B.size() -1;
    int j,k,l;
    for(k=i, j=i; i<=m&&j<=n;){
        if(A[i] <= B[j])
            result[k++]=A[i++];
        else
            result[k++]=B[j++];
    }
    if(i<=m)
        for(int l=0; l<=m-i; l++)
            result[l+k]=A[i+l];
    if(j<=n)
        for(int l=0; l<=n-j; l++)
            result[l+k]=B[j+l];
}

猜你喜欢

转载自blog.csdn.net/qq_34606546/article/details/87876262