NC36 在两个长度相等的排序数组中找到上中位数
描述
给定两个递增数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。
上中位数:假设递增序列长度为n,为第n/2个数
数据范围:,
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度为,空间复杂度为
示例1
输入:
[1,2,3,4],[3,4,5,6]
返回值:
3
说明:
总共有8个数,上中位数是第4小的数,所以返回3。
示例2
输入:
[0,1,2],[3,4,5]
返回值:
2
说明:
总共有6个数,那么上中位数是第3小的数,所以返回2
示例3
输入:
[1],[2]
返回值:
1
题解
双指针解法
使用双指针分别指向2个数组的起始位置,交替将当前索引处数组值较小的索引递增,直到2个索引值等于2个数组总长度的一半,然后取2个索引处值较小的那个。
int findMedianinTwoSortedAray(vector<int> &arr1, vector<int> &arr2)
{
int i = 0;
int k = 0;
int n = arr1.size() - 1;
while (i + k < n)
{
if (arr1[i] < arr2[k])
{
i++;
}
else
{
k++;
}
}
return std::min(arr1[i], arr2[k]);
}
双指针+二分解法
int findMedianinTwoSortedAray(vector<int> &arr1, vector<int> &arr2)
{
int l1 = 0;
int r1 = arr1.size() - 1;
int l2 = 0;
int r2 = arr2.size() - 1;
int m1 = 0;
int m2 = 0;
while (l1 < r1 && l2 < r2)
{
m1 = l1 + (r1 - l1) / 2;
m2 = l2 + (r2 - l2) / 2;
if (arr1[m1] == arr2[m2])
{
return arr1[m1];
}
if (arr1[m1] < arr2[m2])
{
l1 = m1 + 1;
r2 = m2;
}
else
{
r1 = m1;
l2 = m2 + 1;
}
}
return std::min(arr1[l1], arr2[l2]);
}