[LeetCode]4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。

分别查找两个数组的第k/2小的位置,其中较小的那一个前面所有的都可以忽略掉(排除了k/2个数),根据排除数的个数减少 k 的值,继续在剩余的数组中寻找。
如果k/2越界,则选择最后一个。
如果一个数组为空,直接返回另一个数组中第k小的数。
k=1,返回两个数组中最小的。

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    m := len(nums1)
    n := len(nums2)
    l := (m + n + 1) / 2
    r := (m + n + 2) / 2
    return float64(findK(nums1, nums2, 0, m - 1, 0, n - 1, l) + findK(nums1, nums2, 0, m - 1, 0, n - 1, r)) * 0.5
}
func findK(nums1 []int, nums2 []int, l1, r1, l2, r2, k int) int {
    for {
        len1 := len(nums1)
        len2 := len(nums2)
        if len1 == l1 {
            return nums2[l2 + k - 1]
        }
        if len2 == l2 {
            return nums1[l1 + k - 1]
        }
        if k == 1 {
            return min(nums1[l1], nums2[l2])
        }
        i := min(len1, l1 + (k / 2)) - 1
        j := min(len2, l2 + (k / 2)) - 1
        if nums1[i] < nums2[j] {
            k -= (i - l1 + 1)
            l1 = i + 1
        } else {
            k -= (j - l2 + 1)
            l2 = j + 1
        }
    }
}
func min(a, b int) int {
    if a > b {
        return b
    } else {
        return a
    }
}
posted @ 2023-02-26 20:03  Zforw  阅读(15)  评论(0编辑  收藏  举报