题目大意:已知两个排好序的数组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之后的元素
这样递归下去即可。