Leetcode算法题:两个有序数组求中位数
- 要求时间复杂度为O(log(m+n))
思路:
- 暴力解决:合并数组并排序,简单且一定能实现,时间复杂度O(m+n)
- 由于两个数组已经排好序,可一边排序一边合并,用时为第一种的一半,时间复杂度依然为O(m+n)
- 由题目,只需要找中位数,即中位数两侧的元素并不需要完全排序,且两数组长度已知且有序,合并后中位数的索引是固定的,所以只要找到这一个或计算中位数的两个数的索引即可,既然为查找,可用二分查找,即可实现时间复杂度为O(log(m+n))
解决方案:
-
将两数组分别分为左右两部分,左侧的两部分即为包含中位数的左侧,右侧即为可能包含中位数的右侧。由于一个数组的划分位置确定,另一个数组划分位置即可确定,所以只需使用二分查找在一个数组中查找到正确的划分位置就行了。
-
为了防止一个数组中确定界限后另一个数组的分界线数组越界,直接在取小数组作为查找目标。
-
递归查找很简单,但是索引在边界时情况非常复杂,且python中-1索引也可以取到,花了很久才找到问题所在,因此在此记录下来。
def findMedianSortedArrays(nums1, nums2):
def mid_index(left, right):
return (left + right) // 2
# 以下称第一个数组为A,第二个数组为B
def findMedianSortedArraysSorted(short_nums, m, long_nums, n):
is_odd = (m + n) % 2
mid = (m + n - 1) // 2
if m == 0:
if is_odd:
return long_nums[mid]
else: