题意:给你两个数组,求中位数
思路:1.最基础的思路,类似归并排序,将两个数组的合并成一个有序的数组,找第k小;复杂度(O(n+m))
2.二分数组找第k小,然后去另外一个数组找比其小的个数,判断是否第k小,复杂度O(log(n)*log(m));
3.自己想的类似第二个思路,既然你已经二分第一个数组,假设二分的位置为pos,你知道你要找第k小,第二个正好取k-pos个,判断是否是中位数;
但是判断的情况比较多;
4.网上看的比较好的一种写法;在每个数组中取k/2个元素,
如果nums1[k/2]<nums2[k/2]则nums1的k/2个可以舍弃,即必然不是中位数;
class Solution {
public:
int findk(vector<int>a,vector<int>b,int k)
{
int n=a.size();
int m=b.size();
if(n==0)return b[k-1];
if(m==0)return a[k-1];
if(k==1)return min(a[0],b[0]);
if(n>m)return findk(b,a,k);
int z=min(n,k/2);
int y=k-z;
if(a[z-1]<b[y-1])
{
a.erase(a.begin(),a.begin()+z);
return findk(a,b,k-z);
}
else
{
b.erase(b.begin(),b.begin()+y);
return findk(a,b,k-y);
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int m=nums2.size();
double x=findk(nums1,nums2,(n+m+1)/2);
double z=findk(nums1,nums2,(n+m+2)/2);
return (z+x)/2;
}
};