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

来源:互联网 发布:土豆网视频下载 mac 编辑:程序博客网 时间:2024/06/04 18:53

题目: 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%的程序。
这里写图片描述

0 0