题目:
解答:
如果是允许使用额外空间,做一次额外merge操作即可,解答过程比较方便,复杂度为O(n),参见解答一
如果是不允许使用额外空间,那么只能二分查找两个数组,参见解答二,是别人写的。。。
代码:
// 解答一
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size(), len2 = nums2.size();
vector<int> num(len1 + len2);
int index1 = 0, index2 = 0;
for(int i = 0;i < len1 + len2; ++i){
num[i] = index1 < len1 ? (index2 < len2 ? nums1[index1] > nums2[index2] ? nums2[index2++] : nums1[index1++]: nums1[index1++]) : nums2[index2++];
}
return (len1 + len2) % 2 == 0 ? 1.0 * (num[(len1 + len2)/2] + num[(len1+len2)/2 - 1]) /2: 1.0 * num[(len1+len2)/2];
}
};
// 解答二
class Solution {
public:
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2) {
int l1 = nums1.size(), l2 = nums2.size();
if (l1 > l2)
return findMedianSortedArrays(nums2, nums1);
int tot_left = (l1 + l2) >> 1, start = 0, end = l1;
int cut_pos1 = (start + end) >> 1, cut_pos2 = tot_left - cut_pos1;
int max_left, min_right;
while (1) {
if (cut_pos1 != 0 && nums1[cut_pos1 - 1] > nums2[cut_pos2])
end = cut_pos1 - 1;
else if (cut_pos1 != l1 && nums1[cut_pos1] < nums2[cut_pos2 - 1])
start = cut_pos1 + 1;
else
break;
cut_pos1 = (start + end) >> 1;
cut_pos2 = tot_left - cut_pos1;
}
if (cut_pos1 == l1)
min_right = nums2[cut_pos2];
else if (cut_pos2 == l2)
min_right = nums1[cut_pos1];
else
min_right = std::min(nums1[cut_pos1], nums2[cut_pos2]);
if ((l1 + l2) % 2)
return min_right;
if (cut_pos1 == 0)
max_left = nums2[cut_pos2 - 1];
else if (cut_pos2 == 0)
max_left = nums1[cut_pos1 - 1];
else
max_left = std::max(nums1[cut_pos1 - 1], nums2[cut_pos2 - 1]);
return 1.0 * (max_left + min_right) / 2;
}
};