专栏名称: 每日一道算法题
学习算法是一种信仰,每天都需要坚持!
目录
相关文章推荐
51好读  ›  专栏  ›  每日一道算法题

[每日一题]4. Median of Two Sorted Arrays

每日一道算法题  · 公众号  · 算法  · 2017-05-03 08:00

正文

题目描述


难度 Hard

主题 分治算法


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)).


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


解题方案

暴力法

将两个数组合并后,求其中位数。



分治算法

假设两个数组的长度分别是 m 和 n ,它们的数组长度之和为 k 。本题的意思就是在合并的数组中找 k/2 个数。


如果 k 是偶数,那么就是 k / 2  ; 如果 k 是奇数,那么就是 k / 2 与 k / 2 + 1 的均值。


先来说说 k 是奇数的情况, k 是偶数的情况同理。


如果 a 数组里里面第 k/2 个数比 b 数组里面的大,这说明我们要找的数一定不在 b 的 前 k/2 个元素里。 我们使用反证法证明。 假设 a 、b的长度都是 1000, 那么 k = 2000, k/2 = 1000, a 的 第500个数比 b 的 第500个数大 。如果我们要找的数在 b 的前 500 个数里,那么 a 数组的前 500 个数一定在小于 b 数组的第 500 个数,因为只有这样才能凑齐 1000 个数。跟我们的假设 a 的第 500 个数大于 b 的第500 个数矛盾。同理可以求证,我们要找的数,也不可能在 a 的后 k/2 个数里。


还需要考虑一个特殊情况,当 k/2 已经大于 a 的长度,说明我们要找的数字一定不在 a 里,b 同理。

以上分析由二群 @DSC 提供







请到「今天看啥」查看全文