4. 寻找两个正序数组的中位数(教训)

题目:
解法一:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        int len=m+n;
        int index1=0,index2=0;
        int pre=-1,now=-1;
        for(int i=0;i<=len/2;i++){
            pre=now;
            if(index1<m && (index2>=n || nums1[index1]<nums2[index2]) ){
                now=nums1[index1++];
            }
            else{
                now=nums2[index2++];
            }
        }
        if(len%2==1){
            return now;
        }
        else{
            return (pre+now)/2.0;
        }
    }
};

解法二(二分法):

class Solution {
public:

    int find_mink(vector<int> nums1,vector<int> nums2,int k,int startA,int startB){
        int m=nums1.size();
        int n=nums2.size();
      //  cout<<"end"<<endl;
        if(k==1){
         //   cout<<"9"<<endl;
         //   cout<<startA<<":"<<startB<<endl;
          //  cout<<"hehe:"<<m<<endl;
            if(startA>=m)
            {
        //        cout<<11<<endl;
        //        cout<<"s:"<<nums2[startB]<<endl<<11<<endl;
                return nums2[startB];
                
            }
            else if(startB>=n){
         //       cout<<17<<endl;
        //        cout<<"s:"<<nums1[startA]<<endl<<15<<endl;
                return nums1[startA];
            }
            else if(nums1[startA]>nums2[startB]){
                return nums2[startB];
            }
            else{
                return nums1[startA];
            }
        }
        else if(startA>=m){
            // cout<<23<<endl;
            // cout<<startB<<endl;
            // cout<<k-1<<endl;
            // cout<<"s:"<<nums2[startB+k-1]<<endl<<19<<endl;
            return nums2[startB+k-1];
        }
        else if(startB>=n){
            // cout<<28<<endl;
            // cout<<"s:"<<nums1[startA+k-1]<<endl<<24<<endl;
            return nums1[startA+k-1];
        }
        else
        {
            // cout<<28<<endl;
            int half_k=k/2;
            int index1=min(half_k+startA-1,m-1);
            int index2=min(half_k+startB-1,n-1);
            if(nums1[index1]<nums2[index2]){
                // cout<<33<<endl;
                k=k-(index1-startA+1);
                return find_mink(nums1,nums2,k,index1+1,startB);
            }
            else{
                // cout<<38<<endl;
                k=k-(index2-startB+1);
                return find_mink(nums1,nums2,k,startA,index2+1);
            }
        }
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();
        int left=(m+n+1)/2;
        int right=(m+n+2)/2;
        // cout<<"start"<<endl;
        int number1=find_mink(nums1,nums2,left,0,0);
       // cout<<"last1:"<<number1<<endl;
        int number2=find_mink(nums1,nums2,right,0,0);
      //  cout<<"last2:"<<number2<<endl;
        // cout<<"last:"<<number1<<":"<<number2<<endl;
        return (number1+number2)/2.0;
    }
};

教训:写逻辑比较复杂的代码一定要慢慢写,数组边界条件考虑清楚,变量的定义不要忘记。考虑清楚了才不会写代码十分钟,debug两小时,真是美滋滋。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值