给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
【题目说明】:
这道题有简单的思路,就是合并后再进行处理。但是时间上就要慢了,而且还要开辟额外的空间。我的思路是给两个数组分别设立前后两个指针。比较前指针找出两个数组较小的数,比较后指针找出两个数组较大的数。对指针进行++或–,最终找到中位数。
主要步骤并不难,难在指针对于数组边界的判断。当指针到达边界后要对数组进行另外处理。下面代码并不算很优秀,有一些步骤重复,希望网友有好点子可以自行修改。
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
//设立两个指针,分别从小向大,和从大到小。当两个指针满足条件时就找到中位数。
int p, q;
//分别代表数组1和数组2的遍历前指针
int form1, form2;
form1 = form2 = 0;
//代表数组1和数组2的遍历尾指针
int last1, last2;
last1 = nums1Size-1;
last2 = nums2Size-1;
//随便赋值,目的是进入循环
p = 0;
q = 1;
//中位数
double mid;
while(p < q){
if(form1 == nums1Size){ //form1达到边界
p = nums2[form2];
form2++;
}else if(form2 == nums2Size){ //from2达到边界
p = nums1[form1];
form1++;
}else{
//两个数组前指针从前往后都未达到边界
if(nums1[form1]<=nums2[form2]){
p = nums1[form1];
form1++;
}else{
p = nums2[form2];
form2++;
}
}
if(last1 < 0){ //last1达到边界
q = nums2[last2];
last2--;
}else if(last2 < 0){ //last2达到边界
q = nums1[last1];
last1--;
}else{
//两个数组后指针从后往前都未达到边界
if(nums1[last1]>=nums2[last2]){
q = nums1[last1];
last1--;
}else{
q = nums2[last2];
last2--;
}
}
//在符合条件的情况下,计算中位数
if(p <= q)
mid = (p+q)/2.0;
}
return mid;
}
//数组的边界问题