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

来源:互联网 发布:郭富城 熊黛林 知乎 编辑:程序博客网 时间:2024/05/19 20:59

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

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

  1. 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);elsereturn 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);elsereturn find(aLeft, aRight, bMid+1, bRight, k-(bMid-bLeft)-1);}}}


0 0
原创粉丝点击