LeetCode 4. 两个排序数组的中位数

 

 

4. 两个排序数组的中位数

 

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 

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

示例 1:

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

中位数是 2.0

示例 2:

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

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

您是否在真实的面试环节中遇到过这道题目呢?

 

 

我的解答:

 

class Solution {

public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int s1;
        int s2;
        int sHalf;
        int sTwoP;
        
        s1 = nums1.size();
        s2 = nums2.size();
        sHalf = (s1+s2+1)/2-1;
        sTwoP = (s1+s2+1)%2;
        
        if((0==s1)&&(0==s2))
        {     
            return 0;
        }
        if(0==s1)
        {            
            if(0!=sTwoP)
            {
                return 0.5*(nums2[sHalf]+nums2[sHalf+1]);
            }
            else
            {
                return nums2[sHalf];
            }
        }
        if(0==s2)
        {            
            if(0!=sTwoP)
            {
                return 0.5*(nums1[sHalf]+nums1[sHalf+1]);
            }
            else
            {
                return nums1[sHalf];
            }
        }
            
        vector<int> *pp = &nums1;
        vector<int> *pq = &nums2;
        vector<int>::iterator p = pp->begin();
        vector<int>::iterator q = pq->begin();
        int i,j,k;
        
        /*******************************************************************
        c++使用 vector指针访问vector元素时,
        不能简单的类似于c中数组和指针的方式。
        
        需要使用迭代器:    
        vector<int> s;  
        vector<int> *p = &s;  
        s.push_back(1);
        for (vector<int>::iterator it = p->begin(); it != p->end(); it++)  
        {
            cout << *it<<endl;    //使用迭代器,正确  
        }
        
        https://blog.csdn.net/fao9001/article/details/75006369
        *******************************************************************/
                
        
        for(k=0;k<sHalf;k++)
        {
            if((p != pp->end())&&(q != pq->end()))
            {
                if(*p<*q)
                {
                    p++;
                }
                else
                {
                    q++;
                }
            }
            else if(p != pp->end())
            {
                p++;
            }
            else //(q != pq->end())
            {
                q++;
            }
        }
               
        if((p != pp->end())&&(q != pq->end()))
        {
            if(*p<*q)
            {
                i=*p;p++;
            }
            else
            {
                i=*q;q++;
            }
        }
        else if(p != pp->end())
        {
            i=*p;p++;
        }
        else //(q != pq->end())
        {
            i=*q;q++;
        }       
        
        if(0!=sTwoP)
        {
            if((p != pp->end())&&(q != pq->end()))
            {
                if(*p<*q)
                {
                    j=*p;p++;
                }
                else
                {
                    j=*q;q++;
                }
            }
            else if(p != pp->end())
            {
                j=*p;p++;
            }
            else //(q != pq->end())
            {
                j=*q;q++;
            }
            return 0.5*(i+j);
        }
        else
        {
            return i;
        }
    }

};

 

 

提交记录

2080 / 2080 个通过测试用例

状态:

通过

执行用时:64 ms

 

 

我的提交执行用时
已经战胜 47.23 % 的 cpp 提交记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值