class Solution {
public:
int findk(int *a,int *b,int lena,int lenb,int k){
int i=0,j=0;
for(;(i<lena)&&(j<lenb);){
--k;
if(k==0){
if(a[i]<b[j]){
return a[i];
}else{
return b[j];
}
}else{
if(a[i]<b[j]){
++i;
}else{
++j;
}
}
}
return (i>=lena)?b[j+k-1]:a[i+k-1];
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
return ((m+n)&1)?findk(&nums1[0],&nums2[0],m,n,(m+n+1)>>1):
((findk(&nums1[0],&nums2[0],m,n,(m+n)>>1)+findk(&nums1[0],&nums2[0],m,n,((m+n)>>1)+1))*.5);
}
};
class Solution {
public:
int findk(int *a,int *b,int lena,int lenb,int k){
if(lena>lenb){
return findk(b,a,lenb,lena,k);
}
if(lena==0){
return b[k-1];
}
if(k==1){
return min(a[0],b[0]);
}
int pa=min(k>>1,lena);
int pb=k-pa;
return (a[pa-1]<b[pb-1])?findk(a+pa,b,lena-pa,pb,k-pa):findk(a,b+pb,pa,lenb-pb,k-pb);
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m=nums1.size();
int n=nums2.size();
return ((m+n)&1)?findk(&nums1[0],&nums2[0],m,n,(m+n+1)>>1):
((findk(&nums1[0],&nums2[0],m,n,(m+n)>>1)+findk(&nums1[0],&nums2[0],m,n,((m+n)>>1)+1))*.5);
}
};