LeetCode刷题:4. 寻找两个正序数组的中位数(21.09.21)

给定两个大小分别为 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;
    }
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值