找出合并两个排序数组后的数组中位数

#include <iostream>
#include <vector>
using namespace std;

double findMedianNum(vector<int> &vec1, vector<int> &vec2);

int main()
{
    vector<int> vec1 = {3,5,6,7,8,12,20};
    vector<int> vec2 = {1,10,17,18};
    cout << findMedianNum(vec1, vec2) << endl;
}

double findMedianNum(vector<int> &vec1, vector<int> &vec2)
{
    int len1 = vec1.size();
    int len2 = vec2.size();
    if (len1>len2)
    {
	vector<int> temp = vec1;
	vec1 = vec2;
	vec2 = temp;
	int tmp = len1;
	len1 = len2;
	len2 = tmp;
    }
    int start = 0;
    int end = len1;
    int mid = (len1 + len2 + 1) / 2;
    while (start <= end)
    {
	int i = (start + end) / 2;
	int j = mid - i;
	if (i < end && vec2[j-1] > vec1[i])
		 //i偏小了,需要右移
	    start = i + 1;
	else if (i > start && vec1[i-1] >  vec2[j])
		//i偏大了,需要左移
	    end = j - 1;
	else
	{
		//i刚好合适
	   int maxLeft = 0;
	   if (i == 0)
		//数组A的元素都大于数组B的情况   
		maxLeft = vec2[j-1];
	    else if (j == 0)
		//数组A的元素都小于数组B的情况
		maxLeft = vec1[i-1];
	    else
			 //如果大数组的长度是奇数,中位数就是左半部分的最大值
		maxLeft =  max(vec1[i-1], vec2[j-1]);
	    if ((len1+len2)%2 == 1)
		return maxLeft;

	    int minRight = 0;

	    if (i == len1)
		//如果i移动到数组A最后的元素,则最小的元素是数组B第一个元素	
		minRight = vec2[j];
	    else if (j == len2)
		//如果j移动到数组B最后的元素,则最小的元素是数组A第一个元素
		minRight = vec1[i];
	    else
		minRight = min(vec1[i], vec2[j]);
		//如果大数组的长度是偶数,取左侧最大值和右侧最小值的平均
	    return (maxLeft + minRight) / 2.0;
	}
    }
    return 0.0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值