一、思路
方法一:直接将两个数组合并(不去重),然后找出位置在中间的数即可(长度为奇数时只有一个,为偶数时,结果为中间两个数字的平均)
方法二:根据方法一可以知道,中位数,就是两个数组中第k小的数。我们可以设两个指针,在两个数组中去寻找第k小的数(k为总长度的一半)。利用二分法的思想,每次排除一些不可能是第k个的数,然后重新寻找。
假设两个数组为A,B。每次比较的为A[k//2-1],B[k//2-1],较小者及其之前的数都必不可能为第k个数,所以每次都排除较小者和其之前的数。
注意:当某一数组为空时,返回另一数组的未被排除的数的坐标+k 即可
当某一坐标越界时,令其指向数组末位,并且k要多减去越界的值。
二、代码
1.python
代码如下:
1.方法一
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
ret = []
ret.extend(nums1)
ret.extend(nums2)
ret.sort()
n = len(ret)
if n%2 ==0:
res = (ret[n//2-1] + ret[n//2])/2.
else:
res = ret[n//2]
return res
2.方法二
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
def get(k):
index1, index2 = 0, 0
while True:
if index1 == m :
return nums2[index2 + k - 1]
if index2 == n:
return nums1[index1 + k - 1]
if k == 1:
return min(nums1[index1] , nums2[index2])
newIndex1 = min(k//2 + index1 - 1 ,m-1)
newIndex2 = min(k//2 + index2 - 1 ,n-1)
p1,p2 = nums1[newIndex1], nums2[newIndex2]
if p1 <= p2:
k -= newIndex1 - index1 + 1
index1 = newIndex1 + 1
else:
k -= newIndex2 - index2 + 1
index2 = newIndex2 +1
m,n = len(nums1), len(nums2)
total = m + n
if total%2 == 1:
return get((total+1)//2)
else:
return (get(total//2) + get(total//2+1))/2.