给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。(学习大佬的写法)
自己学习写了解析
class Solution {
public double findMedianSortedArrays(int[] A, int[] B) {
//将数组A和数组B的长度进行赋值
int m=A.length;
int n=B.length;
//判断数组A和数组B的长度判断,长的作为B数组
if (m > n) {
return findMedianSortedArrays(B,A); //保证m<=n就是第一数组小于另一个
}
//进行二分查找
//说明数组最小是0,最大的是数组的长度
int imin=0;
int imax=m;
while (imin<=imax){ //无论imax是取什么值,都可以执行,因为空数组的m=0,所以永远找不到有imin>imax的情况
int i=(imax+imin)/2; //求A数组的中心的位置
int j=(m+n+1)/2-i; //i代表A数组左半部分有i个元素,j代表B数组左半部分有j个元素,而左边部分个数要等于右边部分(偶数)
//如果为奇数,则左部分可以比右部分个数多1 因为“/2”对于偶数+1无影响,所以就是j=(m+n)/2-i
if (j!=0&&i!=m&&B[j-1]>A[i]){ //排除有在边界的情况并且B数座左半部分最大值大于A数组右半部分最小值,所以寻找失败,i需要增大
imin=i+1;
}
else if (i!=0&&j!=n&&A[i-1]>B[j]){
imax=i-1; //排除有在边界的情况并且A数座左半部分最大值大于B数组右半部分最小值,所以寻找失败,i需要减小
}else { //剩余就是边界两个值都是寻找成功的(i,j)
int maxLeft=0; //考虑左边界问题
if (i==0){
maxLeft=B[j-1]; //如果切线部分在A数组最前面,则i=0,则左半部分最大值为B[j-1]
}else if(j==0){
maxLeft=A[i-1]; //如果切线部分在B数组最前面,则j=0,则左半部分最大值为A[i-1]
}else {
maxLeft=Math.max(A[i-1],B[j-1]); //非上面两种情况,则不会有边界问题,则需比较A数组与B数组左半部分最大,求出最大
}
if ((m+n)%2==1){ //如果为奇数,则不需要考虑右半部分
return maxLeft;
}
int minRight=0; //考虑右边界问题
if (i==m){
minRight=B[j]; //如果切线部分在A数组最后面,则i=m,右半部分最小值为B[j]
}else if (j==n){
minRight=A[i]; //如果切线部分在B数组最后面,则j=n,右半部分最小值为A[i]
}else {
minRight =Math.min(B[j],A[i]); //非上面两种情况,则不会有边界问题,则需比较A数组与B数组右半部分最小,求出最小
}
return (double) (maxLeft+minRight)/2.0;
}
}
return 0.0;
}
}
结果