问题还是可以的,因为时间要求是O(Log(m+n)),所以我第一个想法就是分治。那对于查找的话,就是采取二分查找。习惯了数组,为了改成容器还花了一阵时间。上代码。
class Solution {
public:
double findKth(vector<int>& A, vector<int>& B, int A_st, int B_st, int k) {
int A_key,B_key;
if (A_st>=A.size()) {
return B[B_st + k - 1];
}
if (B_st>=B.size()) {
return A[A_st + k - 1];
}
if (k == 1) return min(A[A_st], B[B_st]);
if(A_st+k/2-1>=A.size()) A_key=INT_MAX;
else A_key=A[A_st+k/2-1];
if(B_st+k/2-1>=B.size()) B_key=INT_MAX;
else B_key=B[B_st+k/2-1];
if (A_key < B_key){
return findKth(A, B, A_st + k / 2, B_st, k - k / 2);
} else {
return findKth(A, B, A_st, B_st + k / 2, k - k / 2);
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int sum = nums1.size() + nums2.size();
double r;
if (sum%2==1) {
r = findKth(nums1, nums2, 0, 0, sum / 2 + 1);
} else {
r = ((findKth(nums1, nums2, 0, 0, sum / 2)) +
findKth(nums1, nums2, 0, 0, sum / 2 + 1)) / 2.0;
}
return r;
}
};
第一个函数就是很简单的二分查找,查找第k个数。
第二个函数引用了第一个函数,用来计算中位数,区分有奇数个数和偶数个数的情况。
vector和数组的区别在于,第一个函数,数组传入的是size,而容器操作迭代器更为方便一些。