1. 程式人生 > 實用技巧 >leetcode147median-of-two-sorted-arrays

leetcode147median-of-two-sorted-arrays

題目描述

有兩個大小分別為m和n的有序陣列A和B。請找出這兩個陣列的中位數。你需要給出時間複雜度在O(log (m+n))以內的演算法。

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)). 示例1

輸入

[],[1]

/歸併陣列,但是不需要完全估計,只需要合併到中位數即可
//但是,如果m+n為偶數,那麼返回中間兩個值的平均數
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int mid=(m+n)/2+1;
int a=0;
int b=0;
int result;
int result2=0;
for(int i=0;i<mid;i++){
//複雜度為(m+n)/2+1,也就是m+n
if (b>=n || (a<m && A[a]<B[b])){
result=result2;
result2=A[a];
a++;
}
else {
result=result2;
result2=B[b];
b++;
}
}
if ((m+n)%2==0) return double(result+result2)/2.0;
return result2;
}
};

/*
** 獲取兩個陣列的中位數
*/
public double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;//陣列A的長度
int n = B.length;//陣列B的長度
int l = (m+n+1)/2;
int r = (m+n+2)/2;

/*取兩個數的平均值,即適用於總長度m+n是奇數的情況,也適用於是偶數的情況。
* 奇數時,兩次呼叫所獲得的值相等;

偶數時,兩次呼叫所獲得的值不等。中位數即為兩個值的平均值*/
return (getKth(A,0,B,0,l)+getKth(A,0,B,0,r))/2.0;
}


/*獲取陣列A和陣列B結合後的第k小元素(即中位數)
* s1:陣列A當前的開始下標
* s2:陣列B當前的開始下標
*/
private int getKth(int[] A, int s1, int[] B, int s2, int k){


if(A.length==0){//1.陣列A為空,返回陣列B的中位數
return B[s2+k-1];
}
if(B.length==0){//2.陣列B為空,返回陣列A的中位數
return A[s1+k-1];
}
if(k==1){
return Math.min(A[s1],B[s2]);
}


//4.A和B都有多個元素
/*在陣列A中找到第k/2小元素a,在陣列B中找到第k/2小元素b,
**1)如果a和b相等,那麼第k小元素就是a或者b了,
**2)如果a小於b,那麼總體的第k小元素不可能在a的第k/2小元素之前,那麼就可以將其捨棄了
**3)反之如果a大於b,也就可以捨棄b的第k/2小之前的元素了。*/
int mida = Integer.MAX_VALUE;
int midb = Integer.MAX_VALUE;

if(s1+k/2-1<A.length){
mida = A[s1+k/2-1];
}
if(s2+k/2-1<B.length){
midb = B[s2+k/2-1];
}
if(mida<midb){//去除A中小的部分,繼續遞迴尋找
return getKth(A,s1+k/2,B,s2,k-k/2);
}else{//即mina>minb 去除B中小的部分,繼續遞迴尋找
return getKth(A,s1,B,s2+k/2,k-k/2);
}
}

class Solution: def findMedianSortedArrays(self , A , B ): # write code here arr = sorted(A + B) if len(arr)%2 == 1: return (arr[(len(arr)/2)]*1.0) if len(arr)%2 == 0: return ((arr[(len(arr)/2)] + arr[((len(arr)/2)-1)])/2.0)