描述
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
给定两个有序的数组,长度分别问m和n,把这两个数组看成一个整体,求中位数。要求时间复杂度O(log(m+n))。中位数的定义是,如果一个集合有奇数2k + 1
个元素,那排序后第k个数就是中位数,如果有偶数2k
个元素,那么中位数的定义为排序后第k
个数和第k+1
个数的平均值。
分析
看时间复杂度的要求,首先想到的就是二分法,但是如何在两个数组上进行二分呢?我们把这个问题分解一下,先求解在两个有序数组中查找整体第k大的数
,如果m+n
是偶数,则调用两次子过程求平均,如果是奇数,调用一次。我们这样来找第k大的数:
- 假设m和n都大于
k/2
,则比较nums1[k/2 - 1]
和nums2[k - k/2 - 1]
- 如果前者比较大,则可以扔掉
nums2[k - k/2 - 1]
之前的k/2
个数 - 如果后者比较大,则可以扔掉
nums1[k/2 - 1]
之前的k/2
个数 - 如果相等,说明第k个数已经找到
如果m和n中有一个小于k/2
呢?假设n比m小,那么就取min(k/2, n)
和k - min(k/2, n)
作为比较的下标值。
时间复杂度是O(log(k))。在写代码的过程中,边界判断是非常容易出错的,要反复练习。
代码
Python
1 | class Solution: |