最后更新于
最后更新于
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
nums1
, nums2
两个数组都是排好序的, 因此在确定中位数需要遍历多少个位数之后, 使用双指针遍历两个数组, 找到最中间的一个数或两个数.
如果nums1
和nums2
的长度分别为n
和m
, 则需要遍历(n + m) // 2 + 1
次. 考虑到奇偶的区别, 在遍历过程中保存中间的两个数字left
和right
. right
记录当前轮次得到的最小值, left
记录上一轮的最小值. 在输出时根据两个数组总长度的奇偶性选择输出right
还是(left + right) / 2
.
每一轮迭代的过程分为以下几步:
更新left
, 将上一步得到的right
赋值给left
求出两个数组中, 当前指针对应的最小值, 就是整体的下一个最小值, 赋值给right
将上一步找到更小值的指针向后移一位
算法的时间复杂度为.
二分方法的时间复杂度为. 思路是将原始问题转换为寻找第k小的元素. 如果长度为奇数, 求第小的元素; 如果为偶数, 求第小的元素以及第小的元素的平均值.