题目:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
代码:
//思路:合并数组,排序,求中位数
// #define length(a) ((sizeof(a))/sizeof(a[0]))
// #define max(a,b) ((a>b)?(a:b))
void QuickSort(int *a, int start, int end)
{
int i=0,j=0,index=0;
if(start>=end)
{
return;
}
i=start;
j=end;
index=a[i];
while(i<j)
{
while(i<j&&a[j]>=index)
{
j--;
}
a[i]=a[j];
while(i<j&&a[i]<index)
{
i++;
}
a[j]=a[i];
}
a[i]=index;
QuickSort(a, start, i-1); //这里原先写成QuickSort(a,0,i-1)导致超时 快排占用时间
QuickSort(a, i+1, end);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
#if 0 //方法1:合并数组,快排,求中位数。
int i = 0, j = 0;
double zws=0.0;
int len = nums1Size + nums2Size;
printf("%d %d", nums1Size, nums2Size);
int NewNum[len];
memcpy(NewNum, nums1, sizeof(int)*nums1Size);
memcpy(&NewNum[nums1Size], nums2, sizeof(int)*nums2Size);
QuickSort(NewNum, 0, len-1);
if(len%2 != 0)
{
zws = NewNum[len/2];
}else{
zws = (double)(NewNum[len/2-1]+NewNum[len/2])/2;
}
return zws;
#endif
#if 0 //方法2:二分查找,功能未实现,后续完成。不合并数组和排序,通过判断找到中间值
int len = 0;
double zws = 0.0, pre=0.0;
//当nums1为空时
if(nums1 == NULL)
{
if(nums1Size%2 != 0)
{
return nums1[nums1Size/2];
}else{
return (double)((nums1[nums1Size/2-1]+nums1[nums1Size/2])/2);
}
}
//当nums2为空时
if(nums2 == NULL)
{
if(nums2Size%2 != 0)
{
return nums2[nums2Size/2];
}else{
return (double)((nums2[nums2Size/2-1]+nums2[nums2Size/2])/2);
}
}
//求中间值,通过比对找到中间值
len = nums1Size+nums2Size;
int zwsIn = len/2, i=0,j=0;
while(i<nums1Size && j<nums2Size)
{
if(nums1[i]<nums2[j])
{
i++;
}else if(nums1[i]>nums2[j])
{
j++;
}
if((i+j) == zws)
{
}
}
//求出中位数
#endif
}
leetcode-简单-c语言-寻找两个正序数组的中位数-20210801
最新推荐文章于 2023-01-04 23:28:32 发布