时间复杂度为O(log(m+n)),直接想到二分法。
求两个排序数组的中位数,即求两个排序数组中:
- 第k个数(k=(m+n+1)/2,如果m+n为奇数)
- 第k个数与第k+1个数的平均值(k=(m+n)/2,k+1=1+(m+n)/2,如果m+n为偶数)
问题转化为求两个数组中的第k个数,分情况讨论:
- 如果一个数组为空,另一个数组不为空,直接返回另一个数组第k个值
- 如果两个数组都不为空,且k==1,返回两个数组起始值中较小的那一个
- 如果两个数组都不为空,且k!=1,那么采取类似二分法的思想,每次从其中一个数组中排除一部分值,具体见代码
//
// Created by jt on 2020/8/15.
//
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
if ((m + n) % 2 != 0) return findKth(A, m, B, n, (m + n + 1) / 2);
else return (findKth(A, m, B, n, (m + n) / 2) + findKth(A, m, B, n, (m + n) / 2 + 1)) / 2;
}
double findKth(int A[], int m, int B[], int n, int k) {
// 前面三种情况,缺一不可
if (m > n) return findKth(B, n, A, m, k);
if (m == 0) return B[k - 1];
if (k == 1) return min(A[0], B[0]);
int pa = min(k / 2, m), pb = k - pa;
if (A[pa - 1] < B[pb - 1]) return findKth(A + pa, m - pa, B, n, k - pa);
else if (A[pa - 1] > B[pb - 1]) return findKth(A, m, B + pb, n - pb, k - pb);
else return A[pa - 1];
}
};
京公网安备 11010502036488号