原题说明
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:
Example 2:
nums1 = [1, 3]
nums2 = [2]
The median is2.0
nums1 = [1, 2]
nums2 = [3, 4]
The median is(2 + 3)/2 = 2.5
解题思路
这道题的最优解比较难想到. 想到之后, 也要注意处理边界条件.
这里我们使用Divide and Conquer
的方法: 首先抽象出一个函数, 用于寻找两个数组(由小到大)合并之后的第k
个元素. 由于两个数组都是排好序的, 只需要比较他们的第k / 2
个元素, 较小的那个元素至多排在合并后的第k - 1
个位置, 因此该元素以及其左边的元素不可能为合并后的第k
个元素, 均可以排除. 由此我们可以反复调用函数得到最终结果. 边界条件的处理请见代码.
这道题还可以使用二分搜索的办法, 但实际上掌握一种就足以应付面试了, 这里介绍的方法思路相对比较清晰. 读者如果对另一种方法感兴趣, 可以参考这里.
示例代码 (cpp)
1 | class Solution { |
示例代码 (python)
1 | class Solution(object): |
复杂度分析
时间复杂度: O(log(m+n))
空间复杂度: O(1)
归纳总结
这道题没有见过的话不太容易一下子想到. 面试中遇到不要太高兴直接写答案, 要分析思路. 如果类似难度的题目没有遇到过也不要紧张, 面试官很可能会给出提示, 比如面试官如果提示目标复杂度是log
量级的, 那么就应该想到可能是二分搜索或者Divide and Conquer
的解法.