leetcode链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/desc...
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
"""
找出两个已经排序的数组的中位数
解法思路:二分查找
中位数:找有序数组中间的数字,假设中位数是第k个数,即寻找第k个数,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1]
每次取pivot1和pivot2中较小的那个,然后比较pivot1和pivot2的大小
pivot1 > pivot2,说明nums1[0 .. k/2-1]都不可能是中位数,因为nums1[0 .. k/2-1]中的最大值都小于pivot2,所以可以排除nums1[0 .. k/2-1]
pivot1 < pivot2,说明nums2[0 .. k/2-1]都不可能是中位数,因为nums2[0 .. k/2-1]中的最大值都小于pivot1,所以可以排除nums2[0 .. k/2-1]
每次排除掉了一部分元素,所以从k中删除掉排除的元素个数
:type nums1: List[int]
:type nums2: List[int]
:rtype: float
"""
def getKNumber(k):
index1 = index2 = 0
while True:
if index1 == len(nums1): # 第k个数不可能在nums1数组当中
return nums2[index2 + k - 1]
if index2 == len(nums2):
return nums1[index1 + k - 1]
if k == 1:
return min(nums1[index1], nums2[index2])
# 按照index1,index2为起点,不断通过二分查找更新,缩小范围
newIndex1 = min(index1 + k // 2 - 1, len(nums1) - 1)
newIndex2 = min(index2 + k // 2 - 1, len(nums2) - 1)
pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]
if pivot1 <= pivot2:
k -= newIndex1 - index1 + 1
index1 = newIndex1 + 1
else:
k -= newIndex2 - index2 + 1
index2 = newIndex2 + 1
total_length = len(nums1) + len(nums2)
if total_length % 2 == 1: # 如果为奇数个元素,取中间元素即可
return getKNumber(total_length // 2 + 1)
else:
return getKNumber(total_length // 2) / 2 + getKNumber(total_length // 2 + 1) / 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。