解析
Median_0指向合并数组中位数之左
Median_1指向合并数组中位数之右
例1:[1,3,4],[2,5]
合并为[1,2,3,4,5]
Median_0=2(指向3)
Median_1=2(指向3)
例2:[1,4],[2,5]
合并为[1,2,4,5]
Median_0=1(指向2)
Median_1=2(指向4)
Temp0,Temp1分别用于存储Median_0(中位数之左),Median_1(中位数之右)指向的数据
p指向当前已合并数组末尾一个元素的下标
p_0,p_1分别用于遍历nums1,nums2
思路
模拟合并两有序数组(合并有序数组)
合并过程中
当p=Median_0时,说明合并数组前一个插入值nums1[p_0-1]或者nums2[p_1-1]位于中位数之左,则将前一个插入值赋予Temp0
当p=Median_1时,说明合并数组前一个插入值nums1[p_0-1]或者nums2[p_1-1]位于中位数之右,则将前一个插入值赋予Temp1
并且由于Median_0<=Median_1,所以Temp0必然先于Temp1被搜寻到
于是,在Temp1被搜寻到之后,便可终止程序
代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int Median_0,Median_1,p=-1,p_0=0,p_1=0;
int Temp=(nums1Size+nums2Size)%2;
double Temp0,Temp1;
if(Temp){
Median_0=(nums1Size+nums2Size)/2+1;
Median_1=Median_0;
}else{
Median_0=(nums1Size+nums2Size)/2;
Median_1=Median_0+1;
}
Median_0--;
Median_1--;
while(p_0<nums1Size || p_1<nums2Size){
if(p_0<nums1Size && p_1<nums2Size){
if(nums1[p_0]<=nums2[p_1]){
p_0++;
p++;
if(Median_0==p){
Temp0=nums1[p_0-1];
}
if(Median_1==p){
Temp1=nums1[p_0-1];
break;
}
}else{
p_1++;
p++;
if(Median_0==p){
Temp0=nums2[p_1-1];
}
if(Median_1==p){
Temp1=nums2[p_1-1];
break;
}
}
}else{
if(p_0<nums1Size && p_1>=nums2Size){
p_0++;
p++;
if(Median_0==p){
Temp0=nums1[p_0-1];
}
if(Median_1==p){
Temp1=nums1[p_0-1];
break;
}
}else{
p_1++;
p++;
if(Median_0==p){
Temp0=nums2[p_1-1];
}
if(Median_1==p){
Temp1=nums2[p_1-1];
break;
}
}
}
}
return (Temp0+Temp1)/2;
}