解法1:可以直接合并两个数组,然后对数组排序,再根据数组长度的奇偶性返回结果即可
package LeetCode;
import java.lang.reflect.Array;
import java.util.Arrays;
class Solution{
public static void main(String[] args) {
int []num1={1,2};
int []num2={3,4};
double num= findMedianSortedArrays(num1,num2);
System.out.println(num);
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
// 合成的数组
int[] res = new int[len1+len2];
int index = 0;
int left = 0, right = 0;
// 归并排序合成部分
while(left<len1&&right<len2) {
if(nums1[left]<nums2[right]) {
res[index++] = nums1[left++];
} else {
res[index++] = nums2[right++];
}
}
// 判断nums1剩余还是nums2剩余,并将剩余部分加入到合成的数组之后
while(left<len1) {
res[index++] = nums1[left++];
}
while(right<len2) {
res[index++] = nums2[right++];
}
// 判断合成后的数组的长度,求出中位数。返回的是double类型
if((len1+len2)%2==1) { //数组长度为奇数
return (double) res[(len1+len2)/2];
} else { //数组长度为偶数
return (double) (res[(len1+len2)/2]+res[(len1+len2)/2-1])/2;
}
}
}
解法2:不需要将两个数组真的合并,我们只需要找到中位数在哪里就可以了
奇 数 \red {奇数} 奇数 中位数在(len+1)/2
偶 数 \red {偶数} 偶数 中位数为(len+1)/2 和len/2 两数除以2 所以不管是奇数还是偶数,都需要循环遍历(len+1)/2 次,才能找到中位数①.left,right变量保存依次遍历的值,用aStart,bStart分别指向两个数组开始的位置,一次向后移动,每次移动的值的结果记录在right中,因为当长度为偶数是,需要两个数相除,得到其中位数,显然当只有一个变量只记录当前遍历的结果值是不够的,所以这是需要在定义一个变量,left记录上一次的值,也相当于两个中位数中(8,9)前后的关系,比如知道最后一的这个值为中位数9,因为长度为偶数,所以需要两个数,这时left保存的值,即为上一次right复制给left,这里就是一开始left=right 的作用
②.如果 B 数组此刻已经没有数字了,继续取数字 B[ bStart ],则会越界,则会越界,所以判断下 bStart 是否大于数组长度了,这样 || 后边的就不会执行了,也就不会导致错误了,所以增加为 aStart<m&&(bStart) >= n||A[aStart]<B[bStart]) 。
注意
|| 这个运算符 只要有就一个为假,结果就为假了
package LeetCode;
import java.lang.reflect.Array;
import java.util.Arrays;
class Solution{
public static void main(String[] args) {
int []num1={1,2};
int []num2={3,4};
double num= findMedianSortedArrays(num1,num2);
System.out.println(num);
}
public static double findMedianSortedArrays(int[] A, int[] B) {
int m = A.length;
int n = B.length;
int len = m + n;
int left = -1, right = -1;
int aStart = 0, bStart = 0;
for (int i = 0; i <= len / 2; i++) {
left = right;
if (aStart < m && (bStart >= n || A[aStart] < B[bStart])) {
right = A[aStart++];
} else {
right = B[bStart++];
}
}
if ((len & 1) == 0) //len是一个变量让len和1按位做与运算,在这里实际上len&1的作用是:将len按二进制展开,看其最后一位是0还是1,亦即len是偶数还是奇数
return (left + right) / 2.0;
else
return right;
}
}