题目链接
英文链接:https://leetcode.com/problems/median-of-two-sorted-arrays/
中文链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
题目详述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
1 | nums1 = [1, 3] |
示例 2:
1 | nums1 = [1, 2] |
题目详解
- 原问题难以直接递归求解,所以我们先考虑这样一个问题:在两个有序数组中,找出第 k 个数。
- 如果该问题可以解决,那么第
(n + m) / 2
个数就是我们要求的中位数。 - 先从简单情况入手,假设 m、n >= k / 2,各取前 k /2 个元素,比较
nums1[k / 2 − 1]
与nums2[k / 2 − 1]
。- 如果
nums1[k / 2 − 1] > nums2[k / 2 − 1]
,则说明nums2[k / 2 − 1]
及其之前的元素不可能是第 k 大的元素,这部分元素可以淘汰掉,在剩下的元素中找第 k - k / 2 个数。 - 如果
nums1[k / 2 − 1] <= nums2[k / 2 − 1]
,同理也可以将nums1
前面一半元素可以淘汰掉,问题规模缩小了一半。
- 如果
- 现在考虑边界情况,如果 m < k / 2,比较
nums1[m − 1]
与nums2[k / 2 − 1]
(由于k = (n + m ) / 2
,因此 m、n 不可能同时小于k / 2
)。淘汰的规则同上。 - 时间复杂度为
O(log(m + n))
。
1 | public class LeetCode_00004 { |