题目大意:已知两个排好序的数组nums1和nums2,长度分别为m和n,要求的是合并nums1和nums2之后的所有数的中位数。时间复杂度要求O(log(m+n))
题目分析:容易想到的是归并排序算法,用两个指针分别指向nums1和nums2,分别比较两个指针所指向的元素的大小,哪个小,哪个就往后移,直到两个指针都指向了数组的末尾。AC
代码展示:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
vector<int>::iterator it1 = nums1.begin();
vector<int>::iterator it2 = nums2.begin();
while(it1!=nums1.end() || it2!=nums2.end()){
if(it1==nums1.end()){
result.insert(result.end(),it2,nums2.end());
break;
}
if(it2==nums2.end()){
result.insert(result.end(),it1,nums1.end());
break;
}
if(*it1==*it2){
result.push_back(*it1);
result.push_back(*it2);
it1++;
it2++;
}
else if(*it1>*it2){
result.push_back(*it2);
it2++;
}
else{
result.push_back(*it1);
it1++;
}
}
int len = result.size();
if(len%2)
return double(result[len/2]);
else
return double((result[len/2-1]+result[len/2])/2.0);
}
};
另一种比较高效的做法是,求解两个数组的中位数nums1[middle1], nums2[middle2],比较它们的大小,会存在以下三种关系:
1.nums1[middle1]>nums2[middle2], 则排除nums1中排在middle1之后的元素,排除nums2中排在middle2之前的元素
2.nums1[middle1]=nums2[middle2],则返回nums1[middle1]或nums2[middle2]为最终的结果
3.nums1[middle1]<nums2[middle2],则排除nums1中排在middle1之前的元素,排除nums2中排在middle2之后的元素
这样递归下去即可。