给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))
你可以假设 nums1
和 nums2
不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
中位数:
数组长度是奇数,如:[5, 6, 7] ,则中位数是:6
数组长度为偶数,如:[1, 3, 6, 7], 则中位数是: ( 3 + 6 ) / 2 = 4.5
解法1:
class Solution {
public double findMedianSortedArrays(int[] numArr1, int[] numArr2) {
// 1、健壮性判断
double res = boundaryCheck(numArr1, numArr2);
if (res != -1) {
return res;
}
// 2、合并数组
int[] numArr = mergeArr(numArr1, numArr2);
// 3、取中位数
return getMedian(numArr);
}
// 辅助方法1:健壮性判断
public double boundaryCheck(int[] numArr1, int[] numArr2) {
// 健壮性
if (numArr1.length == 0 && numArr2.length == 0) {
return 0;
}
// 健壮性
if (numArr1.length == 0 || numArr2.length == 0) {
if (numArr1.length == 0) {
// 给出中位数
return getMedian(numArr2);
}
if (numArr2.length == 0) {
// 给出中位数
return getMedian(numArr1);
}
}
return -1;
}
// 辅助方法2:合并数组
public int[] mergeArr(int[] numArr1, int[] numArr2) {
int[] numArr = new int[numArr1.length + numArr2.length];
int p = 0;
int q = 0;
int r = 0;
while (p < numArr1.length && q < numArr2.length) {
if (numArr1[p] < numArr2[q]) {
numArr[r] = numArr1[p];
p++;
} else {
numArr[r] = numArr2[q];
q++;
}
r++;
}
// 剩余的
if (p != numArr1.length || p == 0) {
for (int i = p; i < numArr1.length; i++) {
numArr[r] = numArr1[i];
r++;
}
}
// 剩余的
if (q != numArr2.length || q == 0) {
for (int i = q; i < numArr2.length; i++) {
numArr[r] = numArr2[i];
r++;
}
}
return numArr;
}
// 辅助方法3:取中位数
public double getMedian(int[] numArr) {
// 取中位数
int len = numArr.length;
if (len % 2 == 0) {
int a = numArr[len/2 - 1];
int b = numArr[len/2];
return (a + b)/2.0;
} else {
return numArr[(len - 1)/2];
}
}
}