两个正序数组中的中位数

两个正序数组中的中位数

问题描述:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。

示例 1:

1
2
3
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

1
2
3
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

链接:原题链接

解法

  • 思路:维护两个索引,分别指向这两个有序数组的初始位置,比较这两个索引所指向的值哪个较小,较小的索引往后移1位。如此迭代,直到两个索引之和为:(lan(a)+lan(b)+1)/2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    lenA := len(nums1)
    lenB := len(nums2)
    tmpMid0, tmpMid1, tmpMid2 :=0, 0, 0 // 奇数时,使用 tmpMid1 表示中间值;偶数时使用(tmpMid1+tmpMid2)/2 来保存中间值
    count := 0
    oddFlag := true // 是否为基数
    median := 0 // 全量数组的中位数的索引值

    // 计算中位数的索引值
    if (lenA + lenB)%2 == 0 {
    oddFlag = false
    median = (lenA + lenB)/2
    }else {
    median = (lenA + lenB + 1)/2
    }

    var indexA, indexB = 0, 0
    for{

    if count <= median{
    tmpMid1 = tmpMid0
    }else {
    tmpMid2 = tmpMid0
    }

    // 遍历到中间值,根据奇偶来计算中间值
    if count == median + 1 {
    if oddFlag {
    return float64(tmpMid1)
    }else {
    // 偶数,需要获取下一个值,再做均值
    return float64(tmpMid1 + tmpMid2)/2
    }
    }

    count++
    // 数组没有越界或者数组不为空
    if indexA < lenA && indexB < lenB {
    if nums1[indexA] <= nums2[indexB] {
    tmpMid0 = nums1[indexA]
    indexA++
    continue
    }
    if nums1[indexA] > nums2[indexB]{
    tmpMid0 = nums2[indexB]
    indexB++
    continue
    }
    }

    // 只剩 A 了(B 遍历结束)
    if indexA < lenA && indexB >= lenB {
    tmpMid0 = nums1[indexA]
    indexA++
    continue
    }

    // 只剩 B 了(A 遍历结束)
    if indexA >= lenA && indexB < lenB {
    tmpMid0 = nums2[indexB]
    indexB++
    continue
    }
    }
    }

    时间复杂度:O(M+N)
    空间复杂度:O(1)