65. 两个排序数组的中位数
两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。
样例
样例1
输入:
A = [1,2,3,4,5,6]
B = [2,3,4,5]
输出: 3.5
样例2
输入:
A = [1,2,3]
B = [4,5]
输出: 3
挑战
时间复杂度为O(log n)
说明
中位数的定义:
-
这里的中位数等同于数学定义里的中位数。
-
中位数是排序后数组的中间值。
-
如果有数组中有n个数且n是奇数,则中位数为A[(n-1)/2]A[(n−1)/2]。
-
如果有数组中有n个数且n是偶数,则中位数为 (A[n / 2] + A[n / 2 + 1]) / 2(A[n/2]+A[n/2+1])/2.
-
比如:数组A=[1,2,3]的中位数是2,数组A=[1,19]的中位数是10。
public class Solution {
/*
* @param A: An integer array
* @param B: An integer array
* @return: a double whose format is *.5 or *.0
*/
public double findMedianSortedArrays(int[] A, int[] B) {
int retLen = A.length + B.length;
int m = A.length;
int n = B.length;
int[] ret = new int[retLen];
retLen--;
m--;
n--;
int end=retLen/2;
while (retLen >= 0) {
if(0 <= m &&0 <= n){
if (A[m] >= B[n]) {
ret[retLen] = A[m];
m--;
} else {
ret[retLen] = B[n];
n--;
}
}else if(0 <= m){
ret[retLen] = A[m];
m--;
}else if(0 <= n){
ret[retLen] = B[n];
n--;
}
retLen--;
}
retLen=ret.length-1;
if (ret.length % 2 == 0) {
return (ret[retLen / 2] + ret[retLen / 2 + 1]) / 2d;
} else {
return ret[retLen / 2];
}
}
}