寻找两个有序数组的中位数

寻找两个有序数组的中位数

问题描述
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例1

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例2

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

思路
团队训练第二道题目,看到时间复杂度为Olog(m+n),依稀记得二级背过这个概念,查过之后发现是二分法查找,然后我阅读了一位大佬的解题方法,学习了二分法查找的思路,通过分割找到中位数

class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int n=nums1.size();
        int m=nums2.size();//获取数组的长度
        int Lmax1, Lmax2, Rmin1, Rmin2, c1, c2, imin=0, imax=2*n;/*Lmax1,Rmin1之间为数组1割点,c1用于确定数组1割点,由c1可得出c2进而得到数组2割点,
        假想数组为2n+1的长度,imax为下标所以是2n*/
        while(imin<=imax)
        {
            c1=(imin+imax)/2;
            c2=n+m-c1;
            Lmax1=(c1==0)?  INT_MIN: nums1[(c1-1)/2];
            Rmin1=(c1==2*n)?INT_MAX: nums1[c1/2];
            Lmax2=(c2==0)?  INT_MIN: nums2[(c2-1)/2];
            Rmin2=(c2==2*m)?INT_MAX: nums2[c2/2];
            if(Lmax1>Rmin2)
                imax=c1-1;
            else if(Lmax2>Rmin1)
                imin=c1+1;
            else
                break;   
        }
        int Lmax=(Lmax1>Lmax2)?Lmax1:Lmax2;
        int Rmin=(Rmin1

寻找两个有序数组的中位数_第1张图片

你可能感兴趣的:(寻找两个有序数组的中位数)