寻找两个有序数组的中位数,看到的大佬的方法

https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/jiang-qi-zhuan-wei-zhao-liang-ge-you-xu-shu-zu-de-/

两个有序数组的中位数可以转化为---求两个有序数组的第t小的数

 

设i,j分别为nums1和nums2结果的索引位置,n为nums1长度,m为nums2长度。

满足条件为:
1、i+j=k
2、a[i-1]<=b[j]&&b[j-1]<=a[i]

需满足条件{ 0 < i < n          0 < j < m --->  0 <k-i<m                  max(0,k-m)   <i < min(n,k);

则可以根据i的该范围进行二分查找        查找条件需满足i的前一位nums1[i-1] < nums2[j] ,j的前一位nums2[j-1] < nums1[i]

 

@Test
    public void test() {
        int[] nums1 = new int[]{1,2,2};
        int[] nums2 = new int[]{1,2,3};
        findMedianSortedArrays(nums1,nums2);
    }
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int n = nums1.length + nums2.length;
        if (n % 2 == 0){
            return (findMiddle(nums1, nums2, n>>1) + findMiddle(nums1, nums2, (n>>1)+1)) / 2.0;
        } else {
            return findMiddle(nums1, nums2, (n>>1)+1);
        }
    }

    private int findMiddle(int[] nums1, int[] nums2, int k) {
        if (k<=0 || k > (nums1.length + nums2.length)) {
            return 0;
        }
        int le = Math.max(0,k-nums2.length);
        int ri = Math.min(nums1.length,k);
        while (le < ri) {
            int m = le + (ri-le) / 2;
            if (nums2[k - m - 1] > nums1[m]) {
                le = m + 1;
            } else {
                ri = m;
            }
        }
        int max1 = le == 0 ? Integer.MIN_VALUE : nums1[le - 1];
        int max2 = le == k ? Integer.MIN_VALUE : nums2[k-le-1];
        return Math.max(max1,max2);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值