class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
int mid;
bool mid1=false;
mid=(m+n)/2;
if((m+n)%2==0)mid1=true;
int nums3[m+n];
int i=0,j=0,k=0;
while(i<m&&j<n){
if(nums1[i]>nums2[j]){
nums3[k]=nums2[j];
if(k==mid&&!mid1)return double(nums3[k]);
if(k==mid)return (double(nums3[k])+double(nums3[k-1]))/2;
k++;
j++;
}
else{
nums3[k]=nums1[i];
if(k==mid&&!mid1)return double(nums3[k]);
if(k==mid)return (double(nums3[k])+double(nums3[k-1]))/2;
k++;
i++;
}
}
while(j<n){
nums3[k]=nums2[j];
if(k==mid&&!mid1)return double(nums3[k]);
if(k==mid)return (double(nums3[k])+double(nums3[k-1]))/2;
k++;
j++;
}
while(i<m){
nums3[k]=nums1[i];
if(k==mid&&!mid1)return double(nums3[k]);
if(k==mid)return (double(nums3[k])+double(nums3[k-1]))/2;
k++;
i++;
}
return 0;
}
};
随手用归并思想写的代码居然没超时。
递归二分寻找第k个数,两个数组比较,每次排除k/2的数。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size(),n=nums2.size();
int left=(m+n+1)/2;//第几个数
int right=(m+n+2)/2;
return (gts(nums1,0,m-1,nums2,0,n-1,left)+gts(nums1,0,m-1,nums2,0,n-1,right))/2;
return 0;
}
double gts(vector<int>& nums1,int start1,int end1,vector<int>& nums2,int start2,int end2,int k){
int len1=end1-start1+1;
int len2=end2-start2+1;
if(len1>len2)return gts(nums2,start2,end2,nums1,start1,end1,k);
if(len1==0)return nums2[start2+k-1];
if(k==1)return min(nums1[start1],nums2[start2]);
int i=min(start1+k/2-1,end1);
int j=min(start2+k/2-1,end2);
if(nums1[i]>nums2[j])return gts(nums1,start1,end1,nums2,j+1,end2,k-(j-start2+1));
else return gts(nums1,i+1,end1,nums2,start2,end2,k-(i-start1+1));
}
};