
代码 :
class Solution {public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int k = nums1.size() + nums2.size();if(k%2 == 0){int left = findKth(nums1, 0, nums2, 0, k/2);int right = findKth(nums1, 0, nums2, 0, k/2+1);return (left+right) / 2.0;}else{return findKth(nums1, 0, nums2, 0, k/2+1);}}// 从第 i&j元素 开始找第k个元素// e.g 从A数组m下标找第k个数 A[m+k-1] => k=1 return A[m]int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k){// 始终保持短数组在前if(nums1.size()-i > nums2.size()-j)return findKth(nums2, j, nums1, i, k);// 下一个元素为目标元素 -> 递归终点if(k==1) {if(nums1.size() == i) return nums2[j];else return min(nums1[i], nums2[j]);}// case1 : 短数组长度小于k/2// 第一个数组为空, 则在第二个数组中找第k个数if(nums1.size() == i)return nums2[j+k-1];// case2 : si sj =>记录A[k/2] B[k/2] 下标int si = min(i+k/2, (int)nums1.size())-1, sj = j+k/2-1;if(nums1[si] > nums2[sj])return findKth(nums1, i, nums2, sj+1, k-(sj+1-j));else // (nums1[si-1] < nums2[sj-1])return findKth(nums1, si+1, nums2, j, k-(si+1-i));}};
