LC 速查

HOT 100索引 › B11 二分查找 Binary Search

LC 4寻找两个正序数组的中位数Median of Two Sorted Arrays 困难

给定两个升序数组,在 O(log(m+n)) 时间内找出合并后整体的中位数并返回。

思路 在较短数组上二分切分点 i,j=(m+n+1)//2-i;校验左半最大 <= 右半最小(边界用 ±inf),奇取左最大、偶取两侧均值。

class Solution:
    def findMedianSortedArrays(self, nums1: List[int],
                               nums2: List[int]) -> float:
        if len(nums1) > len(nums2):
            nums1, nums2 = nums2, nums1
        m, n = len(nums1), len(nums2)
        total = m + n
        lo, hi = 0, m
        while lo <= hi:
            i = (lo + hi) // 2
            j = (total + 1) // 2 - i
            a1 = nums1[i - 1] if i else float("-inf")
            a2 = nums1[i] if i < m else float("inf")
            b1 = nums2[j - 1] if j else float("-inf")
            b2 = nums2[j] if j < n else float("inf")
            if a1 <= b2 and b1 <= a2:
                if total % 2:
                    return max(a1, b1)
                return (max(a1, b1) + min(a2, b2)) / 2
            if a1 > b2:
                hi = i - 1
            else:
                lo = i + 1
        return 0.0
← 上一题 寻找旋转排序数组中的最小值有效的括号 下一题 →