您的位置:首页 > 其它

leetcode 4. Median of Two Sorted Arrays

2016-03-11 11:30 253 查看
1.题目

 

Total Accepted: 85951 Total
Submissions: 470608 Difficulty: Hard

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)).
有两个排序好的数组,长度分别为m和n,要求在O(log(m+n))时间内找到这两个数组的中位数。

2.思路 
题目乍一看很简单,但是此题难得地方在于用O(log(m+n))时间解决问题。思路参考了http://blog.csdn.net/yutianzuijin/article/details/11499917/

该方法将原问题转变成寻找第k小数的问题(中位数实际上是第(m+n)/2小的数)。
对于原数组A[m]和B
,要寻找第k小的数,首先假设数组A和B的元素个数都大于k/2,我们比较A的第k/2小的元素和B的第k/2小的元素,
即A[k/2-1]和B[k/2-1]两个元素的大小。
有三种情况:
1. A[k/2-1]<B[k/2-1],这表示A的第0~k/2个元素肯定小于我们要找的元素k的,可以淘汰A的前k/2个元素,接下来从A[k/2]和B[0]开始寻找第k-k/2大的数。
2.A[k/2-1]>B[k/2-1],同理,表示B的第0~k/2个元素肯定小于我们要找的元素k的,接下来从B[k/2]和A[0]开始寻找第k-k/2大的数。
3.A[k/2-1]==B[k/2-1],表明找到了第k大的数。

此外我们还需要考虑几个边界条件:

如果A或者B为空,则直接返回B[k-1]或者A[k-1];
如果k为1,我们只需要返回A[0]和B[0]中的较小值;
如果A[k/2-1]=B[k/2-1],返回其中一个;
C++代码如下:

class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
const int m = nums1.size();
const int n = nums2.size();
int total = m+n;
if (total & 1)
return Kth(nums1.begin(), m, nums2.begin(), n, total / 2+1);
else
return (Kth(nums1.begin(), m, nums2.begin(), n, total / 2+1)
+Kth(nums1.begin(), m, nums2.begin(), n, total / 2))/2;
}
private:
typedef vector<int>::iterator Iter;

double  Kth(Iter start1, int m, Iter start2, int n, int k) {
if (m > n) return Kth(start2 , n, start1, m, k);
if (m == 0) return *(start2 + k - 1);
if (k == 1) return min(*start1, *start2);

int pa = min(m, k / 2),pb=k-pa;
if (*(start1 + pa - 1) > *(start2 + pb - 1))
return Kth(start1, m ,start2 + pb, n - pb, k - pb);
else if (*(start1 + pa - 1) < *(start2 + pb - 1))
return Kth(start1 + pa, m - pa, start2, n, k - pa);
else
return *(start1 + pa - 1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 数组