给定两个数字的排序数组,我们希望找到可能的第k个最大和。(一对是第一个数组中的一个元素,第二个数组中的一个元素)。例如,使用数组
总和最大的对是
因此,总和排名第四的货币对是(13,8)。如何找到具有第k个最大和的对?
我正在寻找涉及最小堆或最大堆的解决方案。
这可以在中轻松完成O(k*logk)。我只假设数组以降序排序,以简化表示法。
O(k*logk)
这个想法很简单。我们将逐一找到第1,第2,..,第k个最大值。但是,即使要考虑配对,(i, j)我们也需要同时选择(i-1, j)和(i,j-1),因为它们都大于或等于(i, j)。
(i, j)
(i-1, j)
(i,j-1)
这很像是将所有n*m对放入堆中,然后删除最大k时间。只有我们不需要所有的n*m配对。
n*m
k
heap.add(pair(0, 0)); // biggest pair // remove max k-1 times for (int i = 0; i < k - 1; ++i) { // get max and remove it from the heap max = heap.popMax(); // add next candidates heap.add(pair(max.i + 1, max.j)); heap.add(pair(max.i, max.j + 1)); } // get k-th maximum element max = heap.popMax(); maxVal = a[max.i] + b[max.j];
一些事情要考虑。
max.i + 1 < a.length