寻找两个有序数组中位数思维要点


这道题在leetcode的链接是leetcode

1、问题转化

中位数涉及奇偶问题,根据两个数组长度和是偶数还是奇数,中位数的计算方式是不同的。 遇到这种奇偶问题时,最直接的思维方式是统一奇偶的求解方法。 这里统一的方法就是将问题泛化为寻找第K大的数。

2、灵活的二分查找

常见的二分查找,是在目标序列中进行折半。这里是将第K大中的K进行折半,然后比较两个数组相应位置元素的大小,然后排除掉K/2个元素。同时调整两个数组和寻找目标K。 相当于小步快跑。

3、结束条件

有三个,一个是数组1到头了,直接从数组2返回相应的元素,另一个是数组2到头了,直接从数组1返回相应的元素,第三个是k变为1了,直接返回两个数组头部元素中的较小值。

4、代码

class Solution:
    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
        def getKthElement(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(index1 + k // 2 -1, m-1)
                newIndex2 = min(index2 + k // 2 -1, n-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
        
        m, n = len(nums1), len(nums2)
        totalLength = m + n
        if totalLength % 2 == 1:
            return getKthElement((totalLength+1)//2)
        else:
            return (getKthElement(totalLength//2) + getKthElement(totalLength//2 + 1)) / 2

原创文章,转载请注明出处,否则拒绝转载!
本文链接:抬头看浏览器地址栏

上篇: 二分查找的细节问题
下篇: 最长回文字符串之马拉车算法