题目
分析
题目要求是求两个数组合起来的中位数,并要求在一定的时间复杂度内。
求中位数时要考虑总个数是奇数还是偶数的情况,奇数时中位数为最中间的那个,偶数时为最中间两个和的平均值。
解题时用了最普通的方法,用两个指针分别指向两个数组首部,通过比大小、移动指针找到了最中间数的值,算出中位数返回即可。
要注意的地方就是在指针移动的过程中要禁止指针越界访问数组下标,于是移动后要和数组个数进行比较。
题解
由于一遍就AC了,代码难看也懒得改了- -
偶数情况
if((m+n)%2==0)
{
int index=(m+n)/2-1;
for(int k=0;k<=index;k++) //比较index+1次 得到排在index下标的数
{
if(i==m)
{
value=B[j++];
continue;
}
else if(j==n)
{
value=A[i++];
continue;
}
else
{
if(A[i]>B[j])
value=B[j++];
else if(A[i]<B[j])
value=A[i++];
else
{
value=A[i++];
k++;
if(k<=index)
value=B[j++];
}
}
}
int temp; //再比较一次 得到下标为index+1 的数
if(i==m)
{
temp=B[j];
}
else if(j==n)
{
temp=A[i];
}
else
{
if(A[i]>B[j])
temp=B[j];
else
temp=A[i];
}
value=(value+temp)/2; //计算得出中位数
}
奇数情况
else
{
int index=(m+n)/2;
for(int k=0;k<=index;k++)
{
if(i==m)
{
value=B[j++];
continue;
}
else if(j==n)
{
value=A[i++];
continue;
}
else
{
if(A[i]>B[j])
value=B[j++];
else if(A[i]<B[j])
value=A[i++];
else
{
value=A[i++];
k++;
if(k<=index)
value=B[j++];
}
}
}
}