问题转化
首先,考虑只有一个有序数组的情况:寻找中位数的问题可以转化为寻找一条分割线,满足以下两个条件:
- 这条分割线在数组元素个素为奇数的时候,分割线左边的元素比右边多一个,中位数就是分割线左边的元素。
- 数组元素个数为偶数的时候,分割线左边的元素与右边的元素一样多。中位数是分割线左右两个元素的平均值。
下面考虑两个有序数组,我们可以在两个数组上都划分一条分割线,这两条分割线有以下两个条件 :
- 两条分割线左边的元素个数 = 两条分割线右边的元素个数
- 两条分割线左边的元素均小于右边的元素
此时,这道题就从寻找中位数转化为了寻找满足上述两个条件的分割线。题目要求时间复杂度为O(log (m+n))
,因此能够直接联想到使用二分查找法来找分割线。
解题步骤
寻找满足上述两个条件的分割线,那么我们就围绕上述两个条件来编码:为了描述方便,将nums1设置为长度较短的数组,nums2设置为长度较长的数组。
第一个条件:
要考虑奇数和偶数的情况,如果两个数组长度之和为奇数,那么我们就规定左边元素比右边元素多;如果两个数组长度之和为偶数,那么两边元素相等。由于Java的除法是向下取整(即5/2=2),因此可以讲奇偶两种情况合并,得到左边元素的总个数
t o t a l L e f t = m + n + 1 2 / / 其 中 m , n 分 别 代 表 两 个 数 组 的 长 度 totalLeft = \frac{m+n+1}{2}~~~~~~~~//其中m,n分别代表两个数组的长度 totalLeft=2m+n+1 //其中m,n分别代表两个数组的长度
第二个条件:
要使分割线左边元素均小于右边的元素,因为两个数组均为有序数组,那么