leetcode题目 寻找两个排序数组的中位数

题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
思路: 既然题目要求小于线性时间,那么只能使用分治思想进行查找。循环解法的边界条件太复杂,本文采用递归方式解法。
代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.size() == 0 && nums2.size() == 0)   //若两个都为空则返回0
            return 0;

            vector<int> *IsNULL = &nums1, *NotNULL = &nums2;
        if (nums1.size() == 0 || nums2.size() == 0)   //若一个为空返回另一个数组的中位数
        {
            if (nums1.size())
            {
                IsNULL = &nums2;
                NotNULL = &nums1;                     //指向非空数组
            }
            if (NotNULL->size() % 2)                  //若个数为奇数返回中位数
                return (*NotNULL)[NotNULL->size() / 2];
            else                                      //若个数为偶数返回中间两个数和的平均数
                return static_cast<double> ((*NotNULL)[NotNULL->size() / 2] + (*NotNULL)[NotNULL->size() / 2 - 1]) / 2;
        }

        if ((nums1.size()+nums2.size())%2)      //两个数组都非空且大小为奇数
            return FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2+1);
        else                                   //两个数组都非空且大小为偶数,调用两次查找函数,求平均值
            return static_cast<double> (FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2)
            + FindKthElement(nums1.begin(), --nums1.end(), nums2.begin(), --nums2.end(), (nums1.size() + nums2.size()) / 2+1))/2;
    }

    //寻找两个排序数组中第K个数字
    double FindKthElement(vector<int>::iterator begin1,
                          vector<int>::iterator end1,
                          vector<int>::iterator begin2,
                          vector<int>::iterator end2,
                          int k)
    {
        if (begin1 > end1)                 //如果中位数都不在第一个数组中
            return *(begin2 + k - 1);
        if (begin2 > end2)                 //如果中位数都不在第二个数组中
            return *(begin1 + k - 1);
        auto mid1 = begin1 + (end1 - begin1) / 2;
        auto mid2 = begin2 + (end2 - begin2) / 2;
        int halflen = mid1 - begin1 + mid2 - begin2 + 2;
        //四种情况分别对待
        if (*mid1 < *mid2)                 
        {
            if (halflen>k)
                return FindKthElement(begin1, end1,begin2, mid2-1, k);
            else
                return FindKthElement(mid1+1, end1, begin2, end2, k-(mid1-begin1)-1);
        }
        else
        {
            if (halflen>k)
                return FindKthElement(begin1, mid1-1,begin2 ,end2, k);
            else
                return FindKthElement(begin1, end1, mid2+1, end2, k - (mid2 - begin2) - 1);
        }
    }
};

上边的解法应该是比较容易理解,但是由于是递归调用,所以还可以改为循环实现进行优化。在leetcode上时间运行效率也只击败了30%的程序。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值