LeetCode 4.两个排序数组的中位数 Median of Two Sorted Arrays

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

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

你可以假设 nums1 和 nums2 均不为空。

给定两个有序数组,从中寻找第k大数的变形,重点在于findKth函数的编写

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size(), m = nums2.size();
        if((n + m) % 2 == 0)//为偶数,返回两数的平均数
        {
            return (findKth(nums1, nums2, 0, n, 0, m, (n + m)/2) + findKth(nums1, nums2, 0, n, 0, m, (n + m)/2+1)) / 2.0;
        }
        else//为奇数,直接返回
            return findKth(nums1, nums2, 0, n, 0, m, (n + m)/2+1)* 1.0;

    }
    
    int findKth(vector<int>& nums1, vector<int>& nums2, int start1, int len1, int start2, int len2, int k)
    {
        int p,q;//为两个数组前进的增量
        
        
        if(len1 > len2)//令nums1总为长度短的那一个
        {
            return findKth(nums2, nums1, start2, len2, start1, len1, k);
        }
        if(len1 == 0)//nums1为空,直接返回nums2第k大数
        {
            return nums2[start2+k-1];
        }
         if(k == 1)//k为1
        {
            return nums1[start1] > nums2[start2]?nums2[start2]:nums1[start1];
        }
       

       
        p = k/2>len1?len1:k/2;//防止下标越界
        q = k - p;
        
        if(nums1[start1+p-1] == nums2[start2+q-1])//相等说明找到了
            return nums1[start1+p-1];
        else if(nums1[start1+p-1] > nums2[start2+q-1])//去掉第二个数组的左半部分
        {
            return findKth(nums1, nums2, start1, len1, start2+q, len2-q, k-q);
        }
        else if(nums1[start1+p-1] < nums2[start2+q-1])//去掉第一个数组的左半部分
        {
            return findKth(nums1, nums2, start1+p, len1-p, start2, len2, k-p);
        }
    }
};

解法二:通过vector的erase

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans;//存储排序后的的向量
        int len = nums1.size()+nums2.size();
        while(!nums1.empty() && !nums2.empty())//遍历两个向量,将小的加进去
        {
            if(nums1[0] < nums2[0])
            {
                ans.push_back(nums1[0]);
                nums1.erase(nums1.begin());
            }
            else
            {
                ans.push_back(nums2[0]);
                nums2.erase(nums2.begin());
            }
        }
        
        if(nums1.empty())
        {
            while(!nums2.empty())
            {
                ans.push_back(nums2[0]);
                nums2.erase(nums2.begin());
            }
        }
        
        if(nums2.empty())
        {
            while(!nums1.empty())
            {
                ans.push_back(nums1[0]);
                nums1.erase(nums1.begin());
            }
        }
        
        double k;
        if( len % 2 == 0)//返回最后答案
        {
            double a = ans[ans.size()/2-1];
            double b = ans[ans.size()/2];
            k = (a+b)/2;
        }
        else
            k = ans[ans.size()/2];
        return k;

    }
    
   
};

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值