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)).
Note:求两个sorted array的中间值,不是平均值哦。
Solution1: 先根据两个array的长度找到中间的位置,若总长为偶数,中间值为一个element的值,若总长为偶数,则中间值为两个正中元素的平均值,所以返回参数是double。程序中注意一些细节的判断和极端情况的考虑。如果其中一个数组长度为0呢?如果在判断的过程中数组下标超过了数组范围呢?给数组A和B各分配一个指针,每一次count数组A和B指针所指的较小的值,然后指针后移,直到到达计算出的中间位置。
这种方法不需要额外开辟内存。只记录中间的数值即可。
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
double median=0;
int m = A.length;
int n = B.length;
if(m==0 &&n==0) return 0;
int position=0;
boolean even = false;
if( (m+n)%2==0) {even =true; position = (m+n)/2;}
else {position = (int)((m+n)/2)+1; }
int posA=0, posB=0, posAB=0, mid=0;
while(posAB<position){
if(posA>=m){
mid=B[posB];
posB++;
posAB++;
}
else if(posB>=n){
mid=A[posA];
posA++;
posAB++;
}
else if( A[posA]>=B[posB] ){
mid=B[posB];
posB++;
posAB++;
}
else{
mid=A[posA];
posA++;
posAB++;
}
}
if(!even)
return median=mid;
else{
if(posA<m &&posB<n)
return median= (double)(mid +Math.min(A[posA], B[posB]))/2;
else if(posA>=m) return median = (double)(mid+B[posB])/2;
else return median = (double)(mid+A[posA])/2;
}
}
}
Solution2: 利用一个ArrayList暂存merged array
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if(A.length==0 && B.length==0) return 0;
ArrayList<Integer> merged = new ArrayList<Integer>();
int ptrA = A.length-1;
int ptrB = B.length-1;
while(ptrA>=0 && ptrB>=0){
if(A[ptrA]>=B[ptrB]) {
merged.add(A[ptrA]);
ptrA--;
}
else{
merged.add(B[ptrB]);
ptrB--;
}
}
while(ptrB>=0){
merged.add(B[ptrB]);
ptrB--;
}
while(ptrA>=0){
merged.add(A[ptrA]);
ptrA--;
}
int length = merged.size();
return (merged.get(length>>1) + merged.get((length-1)>>1) )/2.0;
}
}
ArrayList中元素是按从大到小排列。但由于是求居中元素的值,所以没有影响。
“>>”符号为按位右移。如果length是奇数的话,只应返回居中一个元素的值,这时候length>>1和length-1>>1的结果未完全一样的,都是居中元素的坐标。
当length为偶数时,应返回居中两元素的平均数。这时length>>1和length-1>>1分别为居中两元素的下坐标。