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

Posted ethan2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在两个长度相等的排序数组中找到上中位数相关的知识,希望对你有一定的参考价值。

【题目】

给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。要求时间复杂度O(logN),空间复杂度O(1)

【举例】

例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]。

总共8个数,则中位数就是第 4 小的数,为 3.

例如 arr1 = [0,1,2],arr2 = [3,4,5]。

总共6个数,则中位数就是第 3 小的数,为 2.

【难度】

解答

这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

(1)、当 两个数组的长度为偶数时:

我来举个例子说明他拥有的特点吧。我们假定
arr1 = [1, 2,3,4],arr2 = [3,4,5,6]。则数组的长度为 n = 4。

技术图片

分别选出这两个数组的上中位数的下标,即

mid1 = (n-1)/2 = 1。

mid2 = (n - 1)/2 = 1。

技术图片

假如 arr2[mid2] > arr2[mid1],那么我们要找的目标数是一定存在于 arr1[mid1+1...n] 和 arr2[0...mid2]中。而不可能存在于 arr1[0...mid1] 和 arr2[mid2+1...n] 之中。

技术图片

也就是说,我们接下来只需要在arr1[mid1+1...n] 和 arr2[0...mid2] 中查找就行了。

(2)、当两个数组的长度为奇数时:

假定 arr1 = [1, 2,3,4,5],arr2 = [3,4,5,6,7]。则数组的长度为 n = 5。

mid1 = (n-1)/2 = 2。

mid2 = (n - 1)/2 = 2。

这个时候如果 arr2[mid2] > arr1[mid1] 时,则和上面那个情况有点小差别,这时候目标数只存在于 arr1[mid1...n] 和 arr2[0...mid2]中。注意他们的差别,从arr1[mid1+1...n] => arr1[mid1...n]。

理解了这个原理,配合上代码会更好理解,代码如下:

也可以用迭代来做,反而更加简单,迭代版本如下:

以上是关于在两个长度相等的排序数组中找到上中位数的主要内容,如果未能解决你的问题,请参考以下文章

算法总结之 在两个长度相等的排序数组中找到上中位数

递归训练1:在两个?长度相等的排序数组中找到上中位数

数字问题4:在两个长度相等的数组中找上位数

2023-03-02:给定一个数组arr,长度为n, 任意相邻的两个数里面至少要有一个被选出来,组成子序列,才是合法的! 求所有可能的合法子序列中,最大中位数是多少? 中位数的定义为上中位数, [1,

[二分查找] 两个等长有序数组的上中位数

查找中位数而不排序数组