0
点赞
收藏
分享

微信扫一扫

[数组]NC36 在两个长度相等的排序数组中找到上中位数-中等

​​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]);
}

举报

相关推荐

0 条评论