写题记录之寻找两个正序数组的中位数

思路是直接取出合并后的数组长度设为n+m

设i为nums1的指针,初始值是-1

设j为nums2的指针,初始值是-1

当i+j+2=(n+m)/2+1或i+j+2 = (n+m)/2+1时时就计算中间值。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        //cout<< "n1=" <<n<<" m1="<<m<<endl;
        //长度都为零时
        if(n==0&&m==0)return 0;
        //下面两个判断都是有一个数组长度为零直接计算
        if(n==0){
            
            if(m%2!=0)
            return nums2[m/2];
            if(m%2==0)
            return (double(nums2[m/2])+nums2[m/2-1])/2;
        }
        if(m==0){
            //cout<< "n2=" <<n%2<<" m2="<<m<<endl;
            
            if(n%2!=0)
            return nums1[n/2];
            if(n%2==0)
            return (double(nums1[n/2])+nums1[n/2-1])/2;
        }
        //cout<< "n=" <<n<<" m="<<m<<endl;
        
        int i = -1,j = -1;
        int temp = 0;
        
        while(i!=n-1||j!=m-1){
            //cout<<'o'<<endl;
            //j==m-1是为了防止j溢出
            //i!=n-1是为了不让i溢出
            if(j==m-1||i!=n-1&&nums1[i+1]<=nums2[j+1]){
                //cout<< "nums1=" <<nums1[i+1]<<" nums2="<<nums2[j+1]<<endl;
                i++;
                //长度为奇数
                if((n+m)%2!=0){
                    //(n+m)/2+1是中间数的位置,
                    //如3/2=1,1+1 = 2,所以第二个数字是中间数
                    //i+j+2代表进了几位
                if((n+m)/2+1==i+j+2){
                    return nums1[i];
                }
            }
            //长度为偶数
            else if((n+m)%2==0){
                if((n+m)/2+1==i+j+2){
                    double d = (nums1[i]+temp)/2;
                    return (double(nums1[i])+temp)/2;;
                }
            }
            //记住这个数,留下从循环使用
            temp = nums1[i];
           
            }else{
                j++;//表示进一位
                //cout<< "i1=" <<i<<" j1="<<j<<endl;
                //长度为奇数
                if((n+m)%2!=0){
                if((n+m)/2+1==i+j+2){
                    return nums2[j];
                }    
            }
            //长度为偶数
            else if((n+m)%2==0){
                if((n+m)/2+1==i+j+2){
                    double d = (double(nums2[j])+temp)/2;
                    //cout<<nums2[j]<<" "<<temp<<endl;
                    return (double(nums2[j])+temp)/2;;
                }
            }
            //记住这个数,留下从循环使用
            temp = nums2[j];
            
            }
            //cout<< "i=" <<i<<" j="<<j<<endl;
        }
        //cout<<"跳过所有"<<endl;
        return 0;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值