题目: 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%的程序。