难度:hard
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)).
思路参考:http://www.2cto.com/kf/201401/273316.html
代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size()+nums2.size();
if(total & 0x1)//判断奇偶性
{
return findKSortedArrays(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),total/2+1);
}
else
{
return (findKSortedArrays(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),total/2)+findKSortedArrays(nums1.begin(),nums1.size(),nums2.begin(),nums2.size(),total/2+1))/2.0;
}
}
double findKSortedArrays(vector<int>::const_iterator nums1,int m, vector<int>::const_iterator nums2,int n,int k)
{
if(m>n)
return findKSortedArrays(nums2,n,nums1,m,k);
if(m==0)
return *(nums2+k-1);
if(k==1)
return min(*nums1,*nums2);
int ia=min(m,k/2);
int ib=k-ia;
if(*(nums1+ia-1)>*(nums2+ib-1))
{
//删掉B的前ib个元素
return findKSortedArrays(nums1,m,nums2+ib,n-ib,k-ib);
}
else if(*(nums1+ia-1)<*(nums2+ib-1))
{
//删掉A的前ia个元素
return findKSortedArrays(nums1+ia,m-ia,nums2,n,k-ia);
}
else
return *(nums1+ia-1);
}
};
运行时间:44ms