给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。【题目来源:力扣官网】
示例1:
输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数示例2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
解法一:
将两个原始数组的所有元素复制到一个新的数组中去,然后找到新数组的中位数。
注意:关注两个原始数组是否有空数组,关注数组的长度是奇数还是偶数
public class Solution {
public static void main(String[] args) {
int[] n1= {1,3};
int[] n2= {2};
Solution s=new Solution();
double result=s.findMedianSortedArrays(n1, n2);
System.out.println(result);
}
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int[] nums;
int m = nums1.length;
int n = nums2.length;
nums = new int[m + n];//分别获取两个原始数组的长度,并创建一个合并后数组,长度为两个原始数组长度之和
//判断原始数组是否为空,为空时只需求出另一个数组的中位数
if (m == 0) {
//判断数组长度是奇数或是偶数
if (n % 2 == 0) {//当数组长度为偶数时,中位数为最中间两个数的平均数
return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
} else {//当数组长度为奇数时,中位数就是最中间的数子,既数组长度/2
return nums2[n / 2];
}
}
if (n == 0) {
if (m % 2 == 0) {
return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
} else {
return nums1[m / 2];
}
}
int count = 0;//记录新数组中元素个数
int i = 0, j = 0;//i记录nums1,j记录nums2
//循环复制两个原始数组中的元素至新数组中
while (count != (m + n)) {
//判断原始数组哪个数组的第一个元素值小,将小的那一个放入到新数组中
if (nums1[i] < nums2[j]) {
nums[count++] = nums1[i++];
} else {
nums[count++] = nums2[j++];
}
//当i和m一样大时,说明num1已经全部复制到nums中去了
if (i == m) {
//将nums2中剩余元素复制到nums中
while (j != n) {
nums[count++] = nums2[j++];
}
break;
}
//当j和m一样大时,说明num2已经全部复制到nums中去了
if (j == n) {
//将nums1中剩余元素复制到nums中
while (i != m) {
nums[count++] = nums1[i++];
}
break;
}
}
if (count % 2 == 0) {
return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
} else {
return nums[count / 2];
}
}
}
如上代码所示,可以得到两个正序数组的中位数。