给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
解题思路一:合并两个数组,然后求中位数,分类数组长度是奇数和偶数的情况,时间复杂度和空间复杂度都是O(m+n)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int count = m+n;
//新建数组
int[] res = new int[count];
//如果数组1为空,直接取数组2的中位数
if(m==0){
if (n % 2 == 0) {
return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
}else{
return nums2[n / 2];
}
}
//如果数组2为空,直接取数组1的中位数
if(n==0){
if (m % 2 == 0) {
return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
}else{
return nums1[m / 2];
}
}
int i1=0;
int i2=0;
int j=0;
//合并两个数组,只要两个数组中的一个还未合并玩,就继续合并
while(i1<m||i2<n){
//如果其中一个数组已经合并完,那么直接将另一数组数据放入新数组
if(i1>=m||i2>=n) {
if (i1 >= m) {
res[j] = nums2[i2];
i2++;
}else{
res[j] = nums1[i1];
i1++;
}
}else {
//比较两个数组当前下标的数字大小
if (nums2[i2] < nums1[i1]) {
res[j] = nums2[i2];
i2++;
} else {
res[j] = nums1[i1];
i1++;
}
}
j++;
}
//取新数组中位数
if (count % 2 == 0) {
return (res[count / 2 - 1] + res[count / 2]) / 2.0;
} else {
return res[count / 2];
}
}
}
解题思路二:不合并数据,直接通过二分法来解决,解题过程待补充