您的位置:首页 > 其它

LeetCode Median of Two Sorted Arrays

2013-11-29 21:07 288 查看
/article/8793193.html这篇博客上的想法是错的。

虽说在优化思想上是对的,但其对median的理解就是错的,判断时要判断中位数是否想等,而不是只是简单的除2.我的思路是对的,但是这么做的话,很复杂。因为用中位数来判断是否相等,还要对中位数取整用作索引,最麻烦的是要不断改两个数组的起始索引和结束索引。

下面的方法,从最小k的角度进行分析,代码为证,真是漂亮。/article/1536805.html

double findKth(int a[], int m, int b[], int n, int k)
{
//always assume that m is equal or smaller than n
if (m > n)
return findKth(b, n, a, m, k);
if (m == 0)
return b[k - 1];
if (k == 1)
return min(a[0], b[0]);
//divide k into two parts
int pa = min(k / 2, m), pb = k - pa;
if (a[pa - 1] < b[pb - 1])
return findKth(a + pa, m - pa, b, n, k - pa);
else if (a[pa - 1] > b[pb - 1])
return findKth(a, m, b + pb, n - pb, k - pb);
else
return a[pa - 1];
}

class Solution
{
public:
double findMedianSortedArrays(int A[], int m, int B[], int n)
{
int total = m + n;
if (total & 0x1)
return findKth(A, m, B, n, total / 2 + 1);
else
return (findKth(A, m, B, n, total / 2)
+ findKth(A, m, B, n, total / 2 + 1)) / 2;
}
};
这样的代码我是想不出来,写不出来,看了半天才看懂。若是能记住我也就算是没白看。我以为得用两个索引呢,一个起始索引,一个结束索引;我也没想到考虑保证m一定小于n,没考虑k/2和m的关系。为什么用第k小的数就可以更简单些,就是因为第k小k是整数,不是median,不用取整并且作为索引。参数传递的一个是首地址,一个是长度,后面子递归程序改变的依然是当前的首地址和长度。当A数组长度小于k/2时,B数组长度一定大于k/2(否则的话第k小不存在),此时pb为什么为k-pa?其实此时pb完全可以是k/2的,之所以是k-pa是为了当B[pb-1]<A[pa-1]时,能多排除一些值,这样其实所有小于pb
都可以排除了(因为这些都是小于第k大的)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: