问题描述
给定两个有序的数组,要求找出合并后的数组的中位数,要求时间复杂度为 O(log (m + n))
。题目链接:**点我**
样例输入输出
输入:[1, 3], [2]
输出:2.0
输入:[1, 2], [3, 4]
输出:2.5
问题解法
刚开始看这题目时,很容易想到的是用归并的思想,分别从头遍历两个数组直到第 k 个元素,但是这样的时间复杂度是 O(k)
,这跟先使用归并算法再直接查找元素的时间复杂度 O(m + n)
查不多,但是都不满足题目的要求。题目要求的时间复杂度为 O(log (m + n))
,这很容易想到二分查找,而此题也正是用二分查找来解决。
首先,将查找中位数的问题转换为查找两个有序数组中第 k 个元素的问题,接着,在每个数组中,分别查找第 k/2 个元素,将这两个元素进行比较,对于比较小的那个元素,其所在数组中的前面和自己这总共 k / 2 个元素必然包含在两个数组合并后的前 k 个元素之中,因此,在一轮进行查找时就可以跳过这部分元素,在剩下的元素中查找第 k/2 个元素,以此递归下去,直到最后一个元素为止。
此过程时间复杂度为 O(log k)
由于 k < m + n,所以满足题目的 O(log (m + n))
的要求。
代码如下
1 | class Solution |
参考资料
- 一个程序渣渣的小后院. 每天一道LeetCode—–两个有序数组合并后的第K个数[J/OL].https://blog.csdn.net/sinat_35261315/article/details/78249251, 2017-10-16