原题链接

题目描述:

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

示例 1:

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

示例 2:

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

解题思路:

1. 遍历中位数+1次,在每次遍历的时候,判断当前值是多少。
2. 同时记录前一个数字,因为根据题意,如果总长度是2的倍数,那你就要取(mid - 1 + mid) / 2
3. 当for循环结束后,如果总长度为奇数,那么就是最后这个数,总长度为偶数就前一个数+当前数除2就是了

golang示例代码

 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
func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
    len1 := len(nums1)
    len2 := len(nums2)
    mid := (len1 + len2) / 2
    i1 := 0
    i2 := 0
    i := 0
    pre := 0
    sum := 0
    for i <= mid {
        pre = sum
        if i1 < len1 && i2 < len2 { 
            // 两个数组都在范围内,比较两个数大小
            if nums1[i1] < nums2[i2] {
                sum = nums1[i1]
                i1 += 1
            } else {
                sum = nums2[i2]
                i2 += 1
            }
        } else if i1 < len1 && i2 >= len2 {
            // num2遍历完了,nums1还没有遍历完
            sum = nums1[i1]
            i1 += 1
        } else if i2 < len2 && i1 >= len1 {
            // num1遍历完了,nums2还没有遍历完
            sum = nums2[i2]
            i2 += 1
        }
        i += 1
    }
    if (len1 + len2) % 2 == 0 {
        return float64(pre + sum) / float64(2)
    }
    return float64(sum)
}