Leetcode 4. Median of Two Sorted Arrays 好理解的二分法

在这里插入图片描述

  • n1,数组1元素总个数,n2,数组2元素总个数
  • 一个大前提假设:
    • k=(n1+n2+1)/2 当(n1+n2)为奇数时,第k个就是中位数,当(n1+n2)为偶数时,第k和第k+1个数是两个正中间的数
  • m1:从数组1中取的元素的个数,m2:从数组2中取的元素的个数
  • 最终目的:l=r=m1=k-m2。 此时此刻 nums1[m1-1],nums1[m1],nums2[m2-1],nums2[m2] 四个数刚好杂糅在一起
    // // [0…m1-1],[0…m2-1]共同构成序列的前一半,[m1…n1], [m2…n2]则共同构成后一半
  • 如果相等,说明[A_m1-1 A_m1 B_m2-1 Bm2 中,两个A只存在一个]
  • 最后求c1,c2。分别考虑了不存在这四个数的情况。
    • m1==0 说明中位数不在数组1中,
    • m1==n1说明数组1只存在nums1[m1-1]那个元素,没有第nums1[m1]元素,所以需要拿nums1[m1]跟nums2[m2]出来比谁大时,直接pass掉第一个就可以了
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n1=nums1.size(), n2=nums2.size();
        if(n1>n2) return findMedianSortedArrays(nums2, nums1); //必须要交换。否则,后面m2=k-m1,会存在m2越界的情况,即(m2>n2)
        int k=(n1+n2+1)/2; //取前k个数
        int l=0, r=n1;
        int m1,m2;
        while(l<r){
            m1=l+(r-l)/2;
            m2=k-m1;
            if(nums1[m1]<nums2[m2-1]){
                l=m1+1;
            }else r=m1;
        }
        m1=r;
        m2=k-m1;
        int c1=max(m1==0?INT_MIN:nums1[m1-1], m2==0?INT_MIN:nums2[m2-1]);
        if((n1+n2)&1) return c1;
        int c2=min(m1==n1?INT_MAX:nums1[m1], m2==n2?INT_MAX:nums2[m2]);
        return 0.5*(c1+c2);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值