double findMedianSortedArrays(int A[], int m, int B[], int n) { if((m+n)%2==1) return (double)findKthElement(A,m,B,n,(m+n)/2+1); else{ int a=findKthElement(A,m,B,n,(m+n)/2); int b=findKthElement(A,m,B,n,(m+n)/2+1); return ((double)a+(double)b)/2.0; } }
int findKthElement(int *nums, int startIndex,int endIndex, int k){ if(startIndex == endIndex) return nums[k]; int idx = RandSelectElement(nums, startIndex, endIndex); int kk = idx - startIndex + 1; if(kk < k){ return findKthElement(nums, idx+1, endIndex,k-kk); } else if (kk > k){ return findKthElement(nums, startIndex, idx,k); } return nums[idx]; }
int findKthElement(int A[],int m,int B[],int n,int k){ if(m>n) return findKthElement(B,n,A,m,k); if(m==0){ return B[k-1]; } if(k==1) return Min(A[0],B[0]); int countA=Min(k/2,m); int countB=k-countA; if(A[countA-1]<B[countB-1]) return findKthElement(A+countA,m-countA,B,n,k-countA); else if(A[countA-1]==B[countB-1]) return A[countA-1]; else return findKthElement(A,m,B+countB,n-countB,k-countB); }
int findKthLargest(int* nums, int numsSize, int k) { return findKthElement(nums,0,numsSize,numsSize-k+1); }