思路1 转化为求Kth smallest的数
class Solution {
double findKth(vector<int>& nums1, vector<int>& nums2, int k){
if(!nums1.size()) return nums2[k-1];
if(!nums2.size()) return nums1[k-1];
// 这里是中间元素的索引,如果有5个元素,则l = 2
// 如果有6个元素,则l = 3
int l1, l2, v1, v2;
l1 = nums1.size() / 2;
l2 = nums2.size() / 2;
v1 = nums1[l1]; v2 = nums2[l2];
if((k-1) > l1+l2){
if(v1 < v2){
// 区间复制构造函数是左闭右开的
// nums1.begin()+l1+1 保证把l1所在的位置也抛弃了
vector<int> nums1_second(nums1.begin()+l1+1, nums1.end());
return findKth(nums1_second, nums2, k-(l1+1));
}else{
vector<int> nums2_second(nums2.begin()+l2+1, nums2.end());
return findKth(nums1, nums2_second, k-(l2+1));
}
}else{
if(v1 < v2){
// 区间复制构造函数是左闭右开的
// nums2.begin()+l2 保证把l2所在的位置也抛弃了
vector<int> nums2_first(nums2.begin(), nums2.begin()+l2);
return findKth(nums1, nums2_first, k);
}else{
vector<int> nums1_first(nums1.begin(), nums1.begin()+l1);
return findKth(nums1_first, nums2, k);
}
}
}
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// 如果是基数,如5,则left = right = 3
// 如果是偶数,如6,则left = 3, right = 4
int left = (nums1.size() + nums2.size() + 1) / 2;
int right = (nums1.size() + nums2.size() + 2) / 2;
return (findKth(nums1, nums2, left) + findKth(nums1, nums2, right)) / 2;
}
};Last updated