给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
// int medium = 0;
// ArrayList<Integer> arrayList=new ArrayList<>();
// for (int i = 0; i < nums1.length; i++) {
// arrayList.get(i);
// }
// if (nums1.length >= nums2.length) {
// for (int i = 0; i < nums1.length; i++) {
// for (int j = 0; j <nums1.length; j++) {
// if (nums1[i]>=nums2[j]){
// arrayList.get(j);
// }
// }
// medium= (int) arrayList.get((nums1.length + nums2.length) / 2);
// }
// }
// else {
// for (int i = 0; i < nums2.length; i++) {
// for (int j = 0; j < nums2.length; j++) {
// if (nums1[i]>=nums2[j]){
// arrayList.get(j);
// }
// }
// }
// medium= (int) arrayList.get((nums1.length + nums2.length) / 2);
// }
// return medium;
//假设nums1[1,2],nums2[3,4]
//num:1 2 3 4 len=4
//pos:0 1 2 3 ->中位数:pos=(num(1)+num(2)/2)=([num(len-1)/2]+[num(len-1)/2+1])/2
//数组的长度是奇数:mid_pos:(len-1)/2
//数组的长度是偶数:mid_pos:(len-1)/2和(len-1)/2+1
int len=nums1.length+nums2.length;
//index-合并之后的数组下标,index1-nums1数组的的下标,index2-nums2数组的下标
int index=0;int index1=0;int index2=0;
double ans=0.0;//初始化结果
//中位数开始的下标
int pos=(len-1)/2;
boolean enevNum=len%2==0;
while (index<len){
//获取nums1数组
Integer num1 = index1 < nums1.length ? nums1[index1] : null;
//获取nums2数组
Integer num2 = index2 < nums2.length ? nums2[index2] : null;
//比较一下num1和num2的大小
int num;
if (num1 != null && num2 != null) {//说明两个数组并没有遍历完
num = num1 < num2 ? nums1[index++] : nums2[index2++];
} else {
num = num1 == null ? nums1[index++] : nums2[index1++];
}
if (index == pos) {
if (enevNum) {
//nums1+nums2的长度是偶数
ans += num;
} else {
//nums1+nums2的长度是奇数
ans += num;
break;
}
} else if (index == pos + 1) {
//代码能走到这里说明合并之后的数组长度一定是偶数
ans += num*2;
}
//遍历合并之后的数组下标+1
index++;
}
return ans/2;
}
}