class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len = nums1.size() + nums2.size();
if (len % 2 == 0)
return (solve(nums1, 0, nums2, 0, len / 2) + solve(nums1, 0, nums2, 0, len / 2 + 1)) / 2.0;
return solve(nums1, 0, nums2, 0, (len + 1) / 2);
}
int solve(vector<int>& nums1, int s1, vector<int>& nums2, int s2, int k){
if (s1 >= nums1.size())
return nums2[s2 + k - 1];
if (s2 >= nums2.size())
return nums1[s1 + k - 1];
if (k == 1)
return min(nums1[s1],nums2[s2]);
int p1 = s1 + k / 2 - 1;
int p2 = s2 + k / 2 - 1;
int mid1 = p1 < nums1.size() ? nums1[p1] : 99999999; // max
int mid2 = p2 < nums2.size() ? nums2[p2] : 99999999; // max
if (mid1 < mid2)
return solve(nums1, s1 + k / 2, nums2, s2, k - k / 2);
else
return solve(nums1, s1, nums2, s2 + k / 2, k - k / 2);
}
};