二分查找算法leetcode.4

 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1.length > nums2.length) //交换使nums1长度较短
            return findMedianSortedArrays(nums2, nums1);
        int m = nums1.length;
        int n = nums2.length;
        //整体思路,分别将两个数组分割,使得数组左右数量的和近似相等,中间一个则并入左边(1),并且左边最大值不大于右边最小值(2),那么中位数在分割线附近
        //分割线两边的数要满足左上<=右下,左下<=右上,即(2),
        int left = 0, right = m;
        int max = 0, min = 0; //max前一部分的最大值,min后一部分的最小值
        //在nums1中二分查找唯一满足条件的分割线
        while (left <= right) {
            int i = (left + right) / 2;//nums1分割线,表示位于i位置前,表示分割线左边元素个数
            int j = (m + n + 1) / 2 - i;//nums2分割线,表示位于j位置前,表示分割线左边元素个数,

            // l1,r1,l2,r2 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j],考虑边界情况
            int l1 = (i == 0 ? Integer.MIN_VALUE : nums1[i - 1]);
            int r1 = (i == m ? Integer.MAX_VALUE : nums1[i]);
            int l2 = (j == 0 ? Integer.MIN_VALUE : nums2[j - 1]);
            int r2 = (j == n ? Integer.MAX_VALUE : nums2[j]);
            //判断是否满足(2)
            if(l1<=r2) {
                if(l2<=r1) {
                    max = Math.max(l1, l2);//求左边最大值
                    min = Math.min(r1, r2);//求右边最小值
                    break;
                }
                else left=i+1;
            } else {
                if (l2 <= r1)
                    right = i - 1;
            }
        }
        return (m + n) % 2 == 0 ? (max + min) / 2.0 : max;//判断总长度
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值