給定兩個已排序數組 A、B,長度分別為 m、n。求合併後的中位數。要求時間複雜度 O(log(m+n))。
比較 A[k/2-1] 和 B[k/2-1](邊界處理):
基準情況:一數組為空直接返回另一數組第 k-1 個;k=1 返回兩數組首元素較小者。
class Solution {
public:
double findMedianSortedArrays(vector& A, vector& B) {
int m = A.size(), n = B.size();
int total = m + n;
if (total % 2 == 1) return findKth(A, 0, B, 0, (total+1)/2);
else return (findKth(A, 0, B, 0, total/2) + findKth(A, 0, B, 0, total/2+1)) / 2.0;
}
double findKth(vector& A, int i, vector& B, int j, int k) {
if (i >= A.size()) return B[j + k - 1];
if (j >= B.size()) return A[i + k - 1];
if (k == 1) return min(A[i], B[j]);
int step = k / 2;
int aVal = (i + step - 1 < A.size()) ? A[i + step - 1] : INT_MAX;
int bVal = (j + step - 1 < B.size()) ? B[j + step - 1] : INT_MAX;
if (aVal < bVal) return findKth(A, i + step, B, j, k - step);
else return findKth(A, i, B, j + step, k - step);
}
};