题目:寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。
示例1:
nums1 = [1, 3]
nums2 = [2]则中位数是 2.0
示例2:
nums1 = [1, 2]
nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5
解题思路
中位数,又称中点数、中值。中数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的数据比他大,有一半的数据比它小,即如果将两个合并并且排好序之后,中位数为第(m+n)/2小的数(偶数的话,结论类似),那么问题可以转化成寻找第k小的数的问题(k=(m+n)/2)。下面是具体的步骤:
一、A.length>k/2 && B.length>k/2
如果数组A和数组B的元素个数都大于k/2,那么先比较A[k/2-1]和B[k/2-1]的大小,大小有两者情况
- A[k/2-1]<=B[k/2-1]
说明如果数组A和数组B合并在一起之后,A[0]到A[k/2-1]一定排在B[k/2-1]之前,那么我们找第k小>的数,一定不会出现在A[0]到A[k/2-1]之间,所以可以将其抛弃。进而原问题就变成了对新数组A’和>B寻找第(k-k/2)小的数
- A[k/2-1]>B[k/2-1]
结论和1类似
二、A.length<k/2 || B.length<k/2
如果数组数组A和数组B其中一个元素个数小于k/2(两个长度不可能同时小于k/2),这时候以长>度较小的那个数组的长度为标准。假设minnums为元素长度较小的那个,maxnums为元素长度较>大的那个。我们采取比较minnums[minnums.length-1]和maxnums[minnums.length-1]大小来讨论。
- minnums[minnums.length-1]<=maxnums[minnums.length-1]
这种情况就比较简单了,说明两个数组合并之后minnums会全部排在maxnums的前面,所第k小的数为maxnums[k-minnums.length-1]
- minnums[minnums.length-1]>maxnums[minnums.length-1]
因为minnums.length<(k/2),所以maxnums中maxnums[0]到maxnums[minnums.length-1]中肯>定不会有第k小的数,那么将其抛弃掉。进而原问题变成了寻找minnums和maxnums’的第k->minnums.length小的数。
三、其他情况
如果A或者B为空时,直接返回B[k-1]或者A[k-1]
如果k为1,只需要返回A[0]或者B[0]中较小者即可
代码
1 | public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
最终结果

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。