Median of Two Sorted Arrays
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)).
O(N) 208msclass Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int sum = m + n;
if(0 == sum%2)
return ((double)kthSmallNum(A, m, B, n, sum/2) + (double)kthSmallNum(A, m, B, n, sum/2 + 1))/2;
else
return kthSmallNum(A, m, B, n, (sum+1)/2);
}
int kthSmallNum(int A[], int m, int B[], int n, int k)
{
int ia = 0, ib = 0;
int ret = 0;
while(--k >= 0 && ia < m && ib < n)
{
if(A[ia] < B[ib])
ret = A[ia++];
else
ret = B[ib++];
}
while(ia < m && k-- >= 0) ret = A[ia++];
while(ib < n && k-- >= 0) ret = B[ib++];
return ret;
}
};
O(lgN) 180ms。 那么多的数据,真心没快多少!可能只有在数组非常大的时候才有优势。
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int sum = m + n;
if(0 == sum%2)
return ((double)kthSmallNum(A, m, B, n, sum/2) + (double)kthSmallNum(A, m, B, n, sum/2 + 1))/2;
else
return kthSmallNum(A, m, B, n, (sum + 1)/2);
}
int kthSmallNum(int A[], int m, int B[], int n, int k)
{
if(m <= 0)
return B[k-1];
else if(n <= 0)
return A[k-1];
if(1 == k)
{
return A[0] < B[0]? A[0]: B[0];
}
else if(2 == k)
{
if(A[0] < B[0])
return 1 < m? min(A[1], B[0]): B[0];
else
return 1 < n? min(A[0], B[1]): A[0];
}
int ia = m*k/(m+n) - 1;
int ib = n*k/(m+n) - 1;
ia = ia < 0? 0: ia;
ib = ib < 0? 0: ib;
int smallVal = min(A[ia], B[ib]);
if(smallVal != A[ia])
ia = binarySearch(A, m, smallVal);
if(smallVal != B[ib])
ib = binarySearch(B, n, smallVal);
if(ia+ib+2 >= k)
{
return kthSmallNum(A+1, m-1, B+1, n-1, k-2);
}
return kthSmallNum(A+ia+1, m-ia-1, B+ib+1, n-ib-1, k-ia-ib-2);
}
int binarySearch(int A[], int len, int target)
{
int left = 0;
int right = len - 1;
while(left <= right)
{
int mid = (left + right)/2;
if(target == A[mid])
return target;
else if(target > A[mid])
left = mid + 1;
else
right = mid - 1;
}
return right;
}
};