寻找两个有序数组的中位数。
给定两个大小为m和n的有序数组num1和num2.
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。
你可以假设这两数组不会同时为空。
示例1:
num1 = [1,3]
num2 = [2]
则中位数为 2.0
示例2:
num1 = [1,2]
num2 = [3,4]
则中位数为(2 + 3) / 2 =2.5
解题思路:
1.题目获取两个数组的中位数,那么遍历这两个数组到他们的中间位置
2.判断数组总个数是偶数个还是奇数个
第一种:利用辅助数组
1.通过将判断num1数组是否为空,若为空则目标数组的起始位置需要改变
2.将数组进行排序
3.如果合并后的数组总个数为1个时,那么中位数直接是本身;
如果个数是偶数个时,那么中位数是: (num[x / 2] + num[x / 2 - 1]) / 2.0;
如果个数为奇数个时,那么中位数是:num[x / 2];
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
double media = 0;
int x = nums1.length + nums2.length;
int [] num = new int[x];
if (nums1.length != 0){
System.arraycopy(nums1,0,num,0,nums1.length);
System.arraycopy(nums2,0,num,nums1.length ,nums2.length);
}else {
System.arraycopy(nums2,0,num,0,nums2.length);
}
Arrays.sort(num);
if (x % 2 == 0){
media = (num[x / 2] + num[x / 2 - 1]) / 2.0;
}else if (x != 1){
media = num[x / 2];
}else {
media = num[0];
}
return media;
}
第二种:假设这两数组不会同时为空
public static double findMedianSortedArrays_1(int[] nums1, int[] nums2) {
int x = nums1.length + nums2.length;
int [] num = new int[x];
int m = nums1.length;
int n = nums2.length;
if (m == 0 || nums1 == null){
return media(nums2,n);
} else if (n == 0 || nums2 == null){
return media(nums1,m);
} else {
System.arraycopy(nums1,0,num,0,nums1.length);
System.arraycopy(nums2,0,num,nums1.length ,nums2.length);
Arrays.sort(num);
System.out.println("数组是: "+num);
return media(num,x);
}
}
public static double media(int [] num,int x){
if (x % 2 == 0){
return (num[x / 2] + num[x / 2 - 1]) / 2.0;
}else if (x != 1){
return num[x / 2];
}else {
return num[0];
}
}