`
plan454
  • 浏览: 6930 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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)).
看到这题,本来是想寻找每一部分的中间值进行分治想法来解决的。但是写了半天,发现自己实现的特别乱,而且自己的想法也是错误的,于是只能用最暴力的方式来解决,即排序在寻找中位数,
public class Solution {
    public double findMedianSortedArrays(int A[], int B[]) {
   double end = 0.0;
int length = A.length+B.length;
int[] c = new int[length];
int j = 0;
int k = 0;
for(int i = 0;i<length;i++){
if(A.length != 0 && B.length != 0){
if(j<A.length&&k<B.length&&A[j]<=B[k]){
c[i] = A[j];
j++;
}else if(j<A.length&&k<B.length){
c[i] = B[k];
k++;
}else if(j==A.length){
c[i] = B[k];
k++;
}else if(k == B.length){
c[i] = A[j];
j++;
}

}else if(A.length>0 && B.length == 0){
c[i] = A[i];
}else {
c[i] = B[i];

}

}

end = c.length%2 == 0?(c[c.length/2-1]+c[c.length/2])*0.5:c[c.length/2];
return end;
    }
}
但这个明显不是一个最好的方式,因为其时间复杂度是O(m+n),但似乎leetcode并不检查这个,所以还是通过了,时间是377ms。于是在网上找到了一个比较好的解法。
http://www.programcreek.com/2012/12/leetcode-median-of-two-sorted-arrays-java/
既可以将问题转化为寻找第Kth个元素。数组A[M]和数组B[N]有sum = M+N个元素,若sum为奇数,即为寻找组合后的第K=sum/2+1 元素,若为偶数,既可以转换为寻找第K = sum/2 和K+1个元素。之后就可以用二分法进行寻找,既比较两个数组中的加权平均后的第Kth个值,即A[]中的第k*m/(m+n) 个值和B[]中的第k*n/(m+n),比较这两个值,其中较小的可以舍弃,因为所寻找的第K个元素肯定不会在其中,如此一直二分下去,最终的时间复杂度为O(log(m+n)).
public static double findMedianSortedArrays(int A[], int B[]) {
int m = A.length;
int n = B.length;

if ((m + n) % 2 != 0) // odd
return (double) findKth(A, B, (m + n) / 2, 0, m - 1, 0, n - 1);
else { // even
return (findKth(A, B, (m + n) / 2, 0, m - 1, 0, n - 1)
+ findKth(A, B, (m + n) / 2 - 1, 0, m - 1, 0, n - 1)) * 0.5;
}
}

public static int findKth(int A[], int B[], int k,
int aStart, int aEnd, int bStart, int bEnd) {

int aLen = aEnd - aStart + 1;
int bLen = bEnd - bStart + 1;

// Handle special cases
if (aLen == 0)
return B[bStart + k];
if (bLen == 0)
return A[aStart + k];
if (k == 0)
return A[aStart] < B[bStart] ? A[aStart] : B[bStart];

int aMid = aLen * k / (aLen + bLen); // a's middle count
int bMid = k - aMid - 1; // b's middle count

// make aMid and bMid to be array index
aMid = aMid + aStart;
bMid = bMid + bStart;

if (A[aMid] > B[bMid]) {
k = k - (bMid - bStart + 1);
aEnd = aMid;
bStart = bMid + 1;
} else {
k = k - (aMid - aStart + 1);
bEnd = bMid;
aStart = aMid + 1;
}

return findKth(A, B, k, aStart, aEnd, bStart, bEnd);
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics