Tim*_*oad 14 sorting algorithm
给定两个排序的数字数组,我们希望找到具有第k个最大可能总和的对.(一对是第一个数组中的一个元素,第二个数组中是一个元素).例如,使用数组
具有最大总和的对是
因此,第四大总和是(13,8).如何找到具有第k个最大可能总和的对?
我正在寻找一个涉及最小堆或最大堆的解决方案.
Nik*_*bak 24
这可以很容易地完成O(k*logk)
.我只假设数组按降序排序,以简化表示法.
这个想法很简单.我们将逐个找到第1,第2,......,第k个最大值.但是,甚至考虑对(i, j)
我们需要有既(i-1, j)
与(i, j-1)
已经选择的,因为它们都是大于或等于比(i, j)
.
这就像我们将所有n*m
对都推入堆中然后删除最多k
次数一样.只有我们不需要所有n*m
配对.
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];
Run Code Online (Sandbox Code Playgroud)
有些事情需要考虑.
max.i + 1 < a.length
.