There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
本文利用二分查找的思想,如果A[k/2]<B[k/2],那么A中前k/2个元素一定小于AB混合数组的第k小的元素,所以下次只需要在A剩下的元素和B中的元素中找第(k-k/2)小的元素即可。利用迭代算法求解。其中奇数长度数组中位数只有一个,偶数长度数组中位数为其中的两个数字的平均。时间:54ms
代码如下:
class Solution { public: double findKSorteArrays(int A[], int m, int B[], int n, int k){ if (m>n) return findKSorteArrays(B, n, A, m, k); if (m == 0) return B[k-1]; if (k == 1) return min(A[0], B[0]); int px = min(k / 2, m), py = k - px; if (A[px-1] < B[py-1]) return findKSorteArrays(A + px, m - px, B, n, k - px); else if (A[px-1] > B[py-1]) return findKSorteArrays(A, m, B + py, n - py, k - py); else return A[px-1]; } double findMedianSortedArrays(int A[], int m, int B[], int n) { int total = n + m; if (total & 0x1) return findKSorteArrays(A, m, B, n, total / 2 + 1); else return (findKSorteArrays(A, m, B, n, total / 2) + findKSorteArrays(A, m, B, n, total / 2+1))/2; } };