【数组】寻找两个有序数组的中位数
题目描述
给定两个大小为 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];
}