double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(), n = nums2.size(); if ((m+n)%2==0) return (findKthNumber(nums1, 0, nums2, 0, (m+n)/2)+findKthNumber(nums1, 0, nums2, 0, (m+n)/2+1))/2; else return findKthNumber(nums1, 0, nums2, 0, (m+n)/2+1); }
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int size1 = nums1.size(), size2 = nums2.size(), size = size1+ size2; if (size % 2) return findKthNumber(nums1, 0, nums2, 0, size / 2 + 1); else return (findKthNumber(nums1, 0, nums2, 0, size / 2) + findKthNumber(nums1, 0, nums2, 0, size / 2 + 1)) / 2.0; }
int findKthNumber(vector<int> & nums1, int start1, vector<int> & nums2, int start2, int k) { int size1 = nums1.size(), size2 = nums2.size(); if (size1 - start1 > size2 - start2) return findKthNumber(nums2, start2, nums1, start1, k); if (size1 - start1 == 0) return nums2[start2 + k - 1]; if (k == 1) return min(nums1[start1], nums2[start2]); int a = min(k / 2, size1 - start1), b = k - a; if (nums1[start1 + a - 1] < nums2[start2 + b - 1]) return findKthNumber(nums1, start1 + a, nums2, start2, k - a); else return findKthNumber(nums1, start1, nums2, start2 + b, k - b); }
double findKthNumber(vector<int>& nums1, int p1, vector<int>& nums2, int p2, int k) { int m = nums1.size(), n = nums2.size(); if (m-p1>n-p2) return findKthNumber(nums2, p2, nums1, p1, k); if (m-p1==0) return nums2[k-1]; if (k==1) return min(nums1[p1], nums2[p2]); int offset1 = min(k/2, m-p1), offset2 = k-offset1; int q1 = p1+offset1-1, q2 = p2+offset2-1; if (nums1[q1]<nums2[q2]) return findKthNumber(nums1, q1+1, nums2, p2, k-offset1); else if (nums1[q1]>nums2[q2]) return findKthNumber(nums1, p1, nums2, q2+1, k-offset2); else return nums1[q1]; }