题目:
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)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
分析:
这道题目的意思是在两个按顺序排列的数组中找到中位数,并要求时间复杂度为O(log (m+n)).
解法一:
从头开始判断两个数组中每一位的大小,并将两个数组有序的合并到一个新的数组里,然后就可以直接得到中位数。这个解法的复杂度是O(n+m)。
代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums;
int i = 0,j = 0;
int l1 = nums1.size();
int l2 = nums2.size();
while(i<l1||j<l2)
{
if(i>=l1)
{
nums.push_back(nums2[j]);
j++;
continue;
}
if(j>=l2)
{
nums.push_back(nums1[i]);
i++;
continue;
}
if(nums1[i]>nums2[j])
{
nums.push_back(nums2[j]);
j++;
}
else
{
nums.push_back(nums1[i]);
i++;
}
}
if((l1+l2)%2 != 0)
{
return nums[(l1+l2)/2];
}
else
{
return (nums[(l1+l2)/2]+nums[(l1+l2)/2-1])/2.0;
}
}
};
解法二:使用分治的思想,通过函数findkth(int a[],int n,int b[],int m,int k)去求两个有序数组中的第k个数。这个解法的复杂度为
O(log (m+n))。设a的长度小于b
边界条件为:
(1)若a中没有元素,返回b数组的第k个元素
(2)若求第1个元素,则返回a[0]和吧[0]中较小的一个。
(3)如果a的第k/2个元素与b的第k/2个元素相同,则返回a或者b的第k/2个元素。
代码:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int l1 = nums1.size();
int l2 = nums2.size();
int a[1000],b[1000];
for(int i = 0;i<l1;i++)
a[i] = nums1[i];
for(int i = 0;i<l2;i++)
b[i] = nums2[i];
if((l1+l2)%2 == 0)
{
return (findkth(a,l1,b,l2,(l1+l2)/2)+findkth(a,l1,b,l2,(l1+l2)/2+1))/2.0;
}
else return findkth(a,l1,b,l2,(l1+l2)/2+1);
}
double findkth(int a[],int n,int b[],int m,int k)
{
if(n>m)
return findkth(b,m,a,n,k);
if(n == 0)
{
return b[k-1];
}
if(k == 1)
{
return min(a[0],b[0]);
}
int i = min(k/2,n),j = k-i;
if(a[i-1]<b[j-1])
{
return findkth(a+i,n-i,b,m,k-i);
}
else if(a[i-1]>b[j-1])
{
return findkth(a,n,b+j,m-j,k-j);
}
else return a[i-1];
}
};