Skip to content

中位数 ​

2 个序列的中位数 ​

4. 寻找两个正序数组的中位数 hard ​

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数。
Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

算法的时间复杂度应该为 O(log (m+n))
The overall run time complexity should be O(log (m+n)).

解法 计数法

取元素总数 n, 然后计数到 n/2 位置
如果 n 为奇数则停在中位数, 如果 n 为偶数则停在偏后的元素
用 pre 存前一个元素

java
class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int l1 = nums1.length;
        int l2 = nums2.length;
        int n = l1 + l2;
        int pre = -1, curr = -1;
        int p1 = 0, p2 = 0;
        for (int i = 0; i <= n / 2; i++) {
            pre = curr;
            if (p1 == l1)
                curr = nums2[p2++];
            else if (p2 == l2)
                curr = nums1[p1++];
            else if (nums1[p1] < nums2[p2])
                curr = nums1[p1++];
            else
                curr = nums2[p2++];
        }
        if (n % 2 == 0)
            return (pre + curr) / 2.0;
        else
            return curr;
    }
}
go
package main

func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {
	l1, l2 := len(nums1), len(nums2)
	n := l1 + l2
	p1, p2 := 0, 0
	var pre, curr int
	for i := 0; i <= n/2; i++ { // 第一步idx=0
		pre = curr
		switch {
		case p1 == l1:
			curr = nums2[p2]
			p2++
		case p2 == l2:
			curr = nums1[p1]
			p1++
		case nums1[p1] < nums2[p2]:
			curr = nums1[p1]
			p1++
		default:
			curr = nums2[p2]
			p2++
		}
	}
	if n%2 == 0 {
		return float64(pre+curr) / 2
	} else {
		return float64(curr)
	}
}