思路很简明,在两个有序数组里找到中间那位,如果有两个则求个均值返回。
问题分析:常见的是在一个有序数组里找到中位数,在两个有序数字里找到中位数,可以考虑现在其中一个将k分为p+q=k,
这样每次可以丢掉很大一部分。
那么p和q的取值很有讲究
方法一:随机选取
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1=nums1.length,len2=nums2.length;
int len=len1+len2;
if((len&1)==1)
return findKth(nums1,0,len1-1,nums2,0,len2-1,(len+1)/2);
else
return (findKth(nums1,0,len1-1,nums2,0,len2-1,len/2)+findKth(nums1,0,len1-1,nums2,0,len2-1,len/2+1))/2.0;
}
double findKth(int nums1[],int s1,int e1,int nums2[],int s2,int e2,int k){
if(e1<s1)
return nums2[k-1+s2];
if(e2<s2)
return nums1[k-1+s1];
else if(e1-s1>e2-s2)
return findKth(nums2,s2,e2,nums1,s1,e1,k);
else if(k==1)
return Math.min(nums1[s1],nums2[s2]);
int p=1+(int)Math.random()*(Math.min(e1-s1,k-1));
int q=k-p;
if(nums1[s1+p-1]<nums2[s2+q-1]){
return findKth(nums1,s1+p,e1,nums2,s2,e2,k-p);
}else if(nums1[s1+p-1]>nums2[s2+q-1]){
return findKth(nums1,s1,e1,nums2,s2+q,e2,k-q);
}else{
return nums1[s1+p-1];
}
}
}
方法二选取固定值,这个固定值是指每次选择nums1最后一个满足k的位置
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1=nums1.length,len2=nums2.length;
int len=len1+len2;
if((len&1)==1)
return findKth(nums1,0,len1-1,nums2,0,len2-1,(len+1)/2);
else
return (findKth(nums1,0,len1-1,nums2,0,len2-1,len/2)+findKth(nums1,0,len1-1,nums2,0,len2-1,len/2+1))/2.0;
}
double findKth(int nums1[],int s1,int e1,int nums2[],int s2,int e2,int k){
if(e1<s1)
return nums2[k-1+s2];
if(e2<s2)
return nums1[k-1+s1];
else if(e1-s1>e2-s2)
return findKth(nums2,s2,e2,nums1,s1,e1,k);
else if(k==1)
return Math.min(nums1[s1],nums2[s2]);
int p=e1-s1+1;
if(p>=k)
p=1;
int q=k-p;
if(nums1[s1+p-1]<nums2[s2+q-1]){
return findKth(nums1,s1+p,e1,nums2,s2,e2,k-p);
}else if(nums1[s1+p-1]>nums2[s2+q-1]){
return findKth(nums1,s1,e1,nums2,s2+q,e2,k-q);
}else{
return nums1[s1+p-1];
}
}
}