double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(), n = nums2.size(); if ((n + m)&1) return findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2 + 1); else return (findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2 + 1) + findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2)) / 2.0; }
double findKthSortedArrays(vector<int>::iterator nums1_begin, int m, vector<int>::iterator nums2_begin, int n, int k) { if (m < n) { swap(m, n); swap(nums1_begin, nums2_begin); } if (n == 0) return *(nums1_begin + k - 1); if (k == 1) return min(*nums1_begin, *nums2_begin); int pb = min(k / 2, n), pa = k - pb; if (*(nums1_begin + pa - 1) > *(nums2_begin + pb - 1)) return findKthSortedArrays(nums1_begin, m, nums2_begin + pb, n - pb, k - pb); else if (*(nums1_begin + pa - 1) < *(nums2_begin + pb - 1)) return findKthSortedArrays(nums1_begin + pa, m - pa, nums2_begin, n, k - pa); else return *(nums1_begin + pa - 1); }
double findKthSortedArrays(std::vector<int>::iterator it1, int m, std::vector<int>::iterator it2, int n, int k) { if (m > n) return findKthSortedArrays(it2, n, it1, m, k); if (m == 0) return *(it2 + k - 1); if (k == 1) return std::min(*it1, *it2); int pa = std::min(k / 2, m), pb = k - pa; if (*(it1 + pa - 1) < *(it2 + pb - 1)) return findKthSortedArrays(it1 + pa, m - pa, it2, n, k - pa); else if (*(it1 + pa - 1) > *(it2 + pb - 1)) return findKthSortedArrays(it1, m, it2 + pb, n - pb, k - pb); else return *(it1 + pa - 1); }