目录
题目描述:
我的算法:
把两个数组合并到一个数组,然后排序,输出中位数
(细节:显然这里两个数组的大小都不够,我们创建数组nums3。
排序,我用的是冒泡排序 )
当然这里题目期待用到二分查找,我的算法的耗时也比较长
可以看看官方题解
寻找两个有序数组的中位数 - 寻找两个正序数组的中位数 - 力扣(LeetCode)
代码实现:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int nums3[3000];
int i;
for(i=0;i<nums1Size;i++)
{
nums3[i]=nums1[i];
}
for(i=nums1Size;i<nums1Size+nums2Size;i++)
{
nums3[i]=nums2[i-nums1Size];
}
int sum=nums1Size+nums2Size;
for(i=1;i<sum;i++)
{
int exchange=0;
for(int j=0;j<sum-i;j++)
{
if(nums3[j]>nums3[j+1])
{
int temp=nums3[j+1];
nums3[j+1]=nums3[j];
nums3[j]=temp;
exchange=1;
}
}
if(exchange==0)
{
break;
}
}
double ret;
if(sum%2==0)//是偶数
{
ret=(double)(nums3[sum/2]+nums3[(sum/2)-1])/2.0;
return ret;
}else{
return (double)nums3[(sum/2)];
}
}
发现的错误:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int nums3[3000];
int i;
for(i=0;i<nums1Size;i++)
{
nums3[i]=nums1[i];
}
for(i=nums1Size;i<nums1Size+nums2Size;i++)//这里我一开始写的是i<nums1Size,很傻的错误
{
nums3[i]=nums2[i-nums1Size];
}
int sum=nums1Size+nums2Size;//这个地方想到怕溢出,先写的nums1Size+(nums2Size-nums1Siz2)/2
for(i=1;i<sum;i++)//但是nums1和nums2的大小不一定,这个题的数据也不大完全不需要这样
{
int exchange=0;
for(int j=0;j<sum-i;j++)
{
if(nums3[j]>nums3[j+1])
{
int temp=nums3[j+1];
nums3[j+1]=nums3[j];
nums3[j]=temp;
exchange=1;
}//这里完全照搬冒泡排序,未出现错误
}
if(exchange==0)
{
break;
}
}
double ret;
if(sum%2==0)//是偶数
{
ret=(double)(nums3[sum/2]+nums3[(sum/2)-1])/2.0;//这个地方要注意sum/2是数组序号
return ret;
}else{
return (double)nums3[(sum/2)];
}
}
总结:
当写到数组时,需要注意[]内的式子代表的是数组下标。