4.Median of Two Sorted Arrays
描述
有两个排序的数组 nums1 和nums2,它们的大小分别是 m 和 n。
找到两个排序数组的中值。程序的时间复杂度为 O(log(m+n))。
你可以认为 nums1和 nums2 不会同时为空。
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
方法
为了解决这个问题,我们需要明白“中值可以用来做什么”。在统计学里,中值被用来:
将一个集合划分成两个等长的子集,其中一个子集的元素总是比另一个大。
如果我们理解了划分中值的意义,我们就可以很好地理解答案了。
首先将 nums1 在随机位置 i 分成两部分:
left_nums1 | right_nums1
nums1[0], nums1[1], ..., nums1[i-1] | nums1[i], nums1[i+1], ..., nums1[m-1]
因为 nums1 有 m 个元素,所以有 m+1 种划分法(i = 0~m)。
而且我们知道:
len(left_nums1) = i, len(right_nums1) = m - i.
Note: when i = 0, left_nums1 is empty, and when i = m, right_A is empty.
同样的,将 nums2 在随机位置 j 分成两部分:
left_nums2 | right_nums2
nums2[0], nums2[1], ..., nums2[j-1] | nums2[j], nums2[j+1], ..., nums2[n-1]
将 left_nums1和 left_nums2 放在一个集合并将 right_nums1和 right_nums1放在另一个集合。让我们命名为 left_part 和 right_part:
left_part | right_part
nums1[0], nums1[1], ..., nums1[i-1] | nums1[i], nums1[i+1], ..., nums2[n-1]
nums2[0], nums2[1], ..., nums2[j-1] | nums2[j], nums2[j+1], ..., nums2[n-1]
我们可以确定:
1.len(left_part) = len(right_part)
2.max(left_part) <= min(right_part)
之后我们划分所有在 {nums1, nums2} 的元素到两个等长的集合,其中一个集合的元素总是比另一个大。
m e d i a n = m a x ( l e f t p a r t ) + m i n ( r i g h t p a r t ) 2