寻找两个正序数组的中位数(C语言)

这篇博客讨论了一种寻找两个已排序数组中位数的算法,包括两种思路:合并排序和双指针遍历。通过比较数组元素,可以在O(log(m+n))的时间复杂度内找到中位数。当总元素数量为偶数时,中位数是中间两个数的平均值,为奇数时则是中间的那个数。
摘要由CSDN通过智能技术生成

题目:给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。


解决这个问题,一种思想是首先将两个数组合并后排序,直接找到中位数。这种方法的复杂度关键在于排序,可以实现O(log(m+n))的复杂度。

另一种想法就是同时遍历两个数组,遍历到中位数位置时,即可得到中位数。

1. 当m+n为偶数:中位数是遍历的第(len1+len2)/2个数与第(len1+len2)/2+1个数的平均值。

2. 当m+n为奇数:中位数是遍历的第(len1+len2)/2+1个数。

代码如下:

float findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int i=0, head1=0, head2=0, tmp[] = {0, 0}, thres;
    thres = (nums1Size+nums2Size)/2;
	for(i=0;i<thres+1;i++){
		if(nums1Size==0||nums1Size==head1){
			if(i>=thres-1){
				tmp[0]=tmp[1];
				tmp[1]=nums2[head2];
			}
			head2++;
		}
		else if(nums2Size==0||nums2Size==head2){ 	
			if(i>=thres-1){
				tmp[0]=tmp[1];
				tmp[1]=nums1[head1];
			}
			head1++;
		}
		else{
			if(nums1[head1]>nums2[head2]){
				if(i>=thres-1){
                    tmp[0]=tmp[1];
                    tmp[1]=nums2[head2];
			    }
				head2++;
			}
			else if(nums1[head1]<=nums2[head2]){
				if(i>=thres-1){
					tmp[0]=tmp[1];
					tmp[1]=nums1[head1];
				}
				head1++;
			}
		}
	}
	if((nums1Size+nums2Size)%2==0) return (float)(tmp[0]+tmp[1])/2;
	else return (float)tmp[1];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

diqiudq

人过留名,雁过留声。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值