#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;
}