方法一:双指针
使用两个指针p1, p2分别指向nums1和nums2,进行比较,如果nums1[p1] < nums2[p2], 则p1+=1,相反则p2 += 1
方法二:第K小个数
将找中位数问题转化为寻找第K小个数的问题
k = (len(nums1)+len(nums2)) // 2
每次剔除一个数组里面较小的 k // 2 个数
class Solution(object):
def findMedianSortedArrays(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
length = len(nums1) + len(nums2)
if len(nums1) < len(nums2): # 长序列的放在前面,防止越界
nums1, nums2 = nums2, nums1
if length == 2:
if len(nums2) == 0: # 中位数在nums1
return (nums1[0] + nums1[1]) / 2.0
return (nums1[0] + nums2[0]) / 2.0 # nums1和nums2各有一个元素
if length % 2 == 0: # 偶数个元素
EorO = True
k = length // 2
else: # 奇数个元素
EorO = False
k = length // 2 + 1
def helper(nums1, nums2, k):
# if len(nums1) < len(nums2) or (len(nums1) == len(nums2) and nums1[0] > nums2[0]:
# 不明白此处为什么在长度相同的时候,要保证nums1[0]比较小
# 将(len(nums1) == len(nums2) and nums1[0] > nums2[0]删除程序依然可以通过
if len(nums1) < len(nums2):
nums1, nums2 = nums2, nums1
if len(nums2) == 0: # 递归结束条件之一
if EorO == True:
return (nums1[k-1] + nums1[k]) / 2.0
else:
return nums1[k-1]
if k == 1: # 递归结束条件二
if EorO == True:
num = min(nums1[0], nums2[0]) # 取出最小的元素
if num == nums1[0]:
return (num + min(nums1[1], nums2[0])) / 2.0
else:
if len(nums2) > 1: # nums2中的元素不止一个
return (num + min(nums1[0], nums2[1])) / 2.0
else:
return (num + nums1[0]) / 2.0
else:
return min(nums1[0], nums2[0])
t = min(k//2, len(nums2)) # 防止溢出
if nums1[t-1] >= nums2[t-1]: # 剔除nums2中的数
return helper(nums1, nums2[t:], k-t)
else: # 剔除nums1中的数
return helper(nums1[t:], nums2, k-t)
return helper(nums1, nums2, k)