您的位置:首页 > 其它

在两个有序数组中找第N数(算法)

2015-08-20 11:09 190 查看
对于 k <= x+y+1 还是 k > x+y+1 我们都提出了解决的方案,并且每种方案都能把 A 或者 B 的规模减小一半。减小了一半之后,我们将其作为一个新的问题继续使用上面的算法处理,直到 A 或者 B 减小到足够小:

A 没有了,这样只需要找出 B 中第 k 大的元素,也就是 B[k]。

B 没有了,同上结果就是 A[k]。

public class NumX {

private int[] a;
private int[] b;

public int find(int aLeft, int aRight, int bLeft, int bRight, int k) {
if (aLeft > aRight)
return b[bLeft+k-1];
if (bLeft > bRight)
return a[aLeft+k-1];

int aMid = (aLeft + aRight) / 2;
int bMid = (bLeft + bRight) / 2;

if (a[aMid] <= b[bMid]) {
if (k <= (aMid-aLeft) + (bMid-bLeft) + 1)
return find(aLeft, aRight, bLeft, bMid-1, k);
else
return find(aMid+1, aRight, bLeft, bRight, k-(aMid-aLeft)-1);
} else {
if (k <= (aMid-aLeft) + (bMid-bLeft) + 1)
return find(aLeft, aMid-1, bLeft, bRight, k);
else
return find(aLeft, aRight, bMid+1, bRight, k-(bMid-bLeft)-1);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: