两个数组一个长度为m,一个长度为n,总长度total=m+n,k=(total/2)。由于两个数组是有序的,所以我们只需要找到两个数组中的第k+1个元素(总长度为偶数的时候,还要找到第k个元素)。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size() + nums2.size();
if(total % 2 == 0){
int left = findK(nums1, 0, nums2, 0, total/2);
int right = findK(nums1, 0, nums2, 0, total/2+1);
return (left+right)/2.0;
}
else{
return findK(nums1, 0, nums2, 0, total/2+1);
}
}
int findK(vector<int>& nums1, int i, vector<int>& nums2, int j, int k){
if(nums1.size()-i > nums2.size()-j) return findK(nums2, j, nums1, i, k);
if(k == 1){
if(nums1.size() == i) return nums2[j];
else return min(nums1[i], nums2[j]);
}
if(nums1.size() == i){
return nums2[j+k-1];
}
int si = min((int)nums1.size(), i+k/2);
int sj = j+k/2;
//若nums[sj-1]小,0————sj-1的元素就舍弃掉
if(nums1[si-1] > nums2[sj-1]){
return findK(nums1, i, nums2, sj, k-(sj-j));
}
//若nums[si-1]小,0————si-1的元素就舍弃掉
else{
return findK(nums1, si, nums2, j, k-(si-i));
}
}
};