做法1:O(N+M)做法为一次排除一个元素,
做法2:一次排除k个元素。
做法为,如果中位数的位置是k,说明它前面有mid个元素。咱们希望能排出mid/2个元素。当不需要排出元素时,说明他前面要么有一个元素,要么没有元素。
咱们让中位数的位置等于第二个中位数(如果是偶数),防止碰不到他。
由于咱们每次排出一半的元素,到最后前面一定会剩一个元素,所以第一个中位数是一定可以取到的。当剩余要排的只有一个元素时,咱们取4个元素,就保证都能搞到了。
这里用分治做,可以避免循环,也挺好的。
class Solution {
public:
// nums1.size <= nums2.size
double divide_conquer(vector<int>& nums1, vector<int>& nums2, int p1, int p2)
{
// 计算要删除的元素个数
int mid_pos = (nums1.size() + nums2.size())/2; //靠右的中位数位置
int k = (mid_pos-p1-p2)/2;
// 处理一个数组完全切掉的情况
if(p1 >= nums1.size())
{
int l = (nums2.size()-nums1.size())/2, r = (nums2.size()-nums1.size()-1)/2;
return (nums2[l] + nums2[r])/2.0;
}
// 如果k = 0,返回中位数
if(k == 0)
{
vector<int> v;
int s1 = min<int>(2, nums1.s