您的位置:首页 > 其它

leetcode 4. Median of Two Sorted Arrays

2017-10-09 15:35 411 查看
There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).Example 1:
nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 
若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
取A[k / 2] B[k / 2] 比较,
如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。

class Solution {
public:
double findMedianSortedArrays(vector<int>& A, vector<int>& B)
{
int k = A.size() + B.size();
if (k % 2 == 1)
return double(find_k( k/2 + 1, A, B));
else
return double(find_k(k/2, A, B) + find_k(k/2 + 1, A, B) ) / 2;
}

int find_helper(int k, vector<int>& vt1, vector<int>& vt2, int pos1, int pos2)
{
if (pos1 == vt1.size())  //vt1已经没有可以用来比较的了。直接返回vt2的对应位
{
return vt2[pos2 + k - 1];
}
else if (pos2 == vt2.size())
{
return vt1[pos1 + k - 1];
}

if (k == 1) //如果k==1,比较vt1和vt2的当前开始位
{
return min(vt1[pos1], vt2[pos2]);
}

int kk = k / 2;
if (vt1.size() - pos1 >= kk && vt2.size() - pos2 >= kk)     //vt1和vt2都有kk个可以用来比较
{
if (vt1[pos1 + kk - 1] <= vt2[pos2 + kk - 1])
return find_helper(k - kk, vt1, vt2, pos1 + kk, pos2);
else
return find_helper(k - kk, vt1, vt2, pos1, pos2 + kk);
}
else if (vt1.size() - pos1 < kk)
{
if (vt1[vt1.size() - 1] <= vt2[vt1.size() - pos1 - 1])
return find_helper(k - vt1.size() - pos1, vt1, vt2, vt1.size(), pos2);
else
return find_helper(k - vt1.size() - pos1, vt1, vt2, pos1, pos2 + vt1.size() - pos1);
}
else //如果vt2后面的部分不够kk个了,就只比较vt2的最后一个
{
if (vt1[vt2.size() - pos2 - 1] <= vt2[vt2.size() - 1])
return find_helper(k - vt2.size() - pos2, vt1, vt2, pos1 + vt2.size() - pos2, pos2);
else
return find_helper(k - vt2.size() - pos2, vt1, vt2, pos1, vt2.size());
}
return -1;
}

int find_k(int k, vector<int>& vt1, vector<int>& vt2)
{
return find_helper(k, vt1, vt2, 0, 0);
}
};

头条面试问到了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: