【发布时间】:2014-02-16 11:26:31
【问题描述】:
这是从here粘贴的代码
我无法理解它在做什么。我可以想到一个简单的算法来在合并时找到两个排序数组的中位数。这个想法是比较两个数组的中位数(m1,m2),如果m1 < m2 找到从 m1 开始的右第一个子数组和左第二个子数组到 m2 的中位数。以下代码在同一行中执行此操作,但我无法完全理解。
double findMedian(int A[], int B[], int l, int r, int nA, int nB) {
if (l>r)
return findMedian(B, A, max(0, (nA+nB)/2-nA), min(nB, (nA+nB)/2), nB, nA); //What does the min/max do here
int i = (l+r)/2;
int j = (nA+nB)/2 – i – 1;
if (j>=0 && A[i] < B[j])
return findMedian(A, B, i+1, r, nA, nB);
else if (j<nB-1 && A[i] > B[j+1])
return findMedian(A, B, l, i-1, nA, nB);
else {
if ( (nA+nB)%2 == 1 ) return A[i];
else if (i>0) return (A[i]+max(B[j], A[i-1]))/2.0; //I couldn't understand this
else return (A[i]+B[j])/2.0;
}
}
double findMedianSortedArrays(int A[], int n, int B[], int m) {
if (n<m)
return findMedian(A, B, 0, n-1, n, m);
else
return findMedian(B, A, 0, m-1, m, n);
}
代码的第二行是做什么的?除此之外,我无法理解最后一个 else 块将如何返回中位数。当n + m 为奇数时,i 索引是否包含中位数?
感谢任何帮助、链接或指针。
【问题讨论】:
-
也许你应该问问写这部分代码的人?
-
如果 A={1;1} B={0;0;6;6} 算法返回 3.5 但正确答案是 1。如果 A={1;1} B={0 ;6} 缓冲区溢出。
-
这是一个来自 leetcode 的问题(这里是link)。正如@Mr K 所提到的,您提供的算法不会给出正确的结果。为什么要费心去理解它呢?