给定两个大小为 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;
}
};