您需要一个容器来保存数组的k
第 th 项index和 index 。i
i
k
public class Node {
int item, arrIndx, itemIndx;
public Node(int a, int b, int c) {
this.item = a;
this.arrIndx = b;
this.itemIndx = c;
}
}
使用 minHeap(保持按升序对其元素进行排序的优先级队列)来包含Node
.
首先,对于每个数组,将其第一个元素推入 minHeap。minHeap 如何保存第一个n
排序的元素。
现在从minHeap中一个一个地弹出所有数组项中最小的最前面的元素,并将其放入输出数组中。在弹出 th 数组的任何第k
th 元素时,将 th 数组的第 th 元素放入队列中。这样我们可以确保,我们正在推动当前最小元素的直接最小元素。i
k + 1
i
继续此过程,直到所有数组元素都从 minHeap 中推送和弹出。
示例 Java 代码段将如下所示:
public List<Integer> mergekSortedArrays(int[][] arrays) {
List<Integer> result = new ArrayList<Integer>();
if (arrays == null || arrays.length == 0) {
return result;
}
PriorityQueue<Node> minHeap = new PriorityQueue<Node>(arrays.length,
new Comparator<Node>() {
public int compare(Node lhs, Node rhs) {
return lhs.item - rhs.item;
}
}
);
// O(n log n)
for (int i = 0; i < arrays.length; i++) {
if (arrays[i].length > 0) {
minHeap.offer(new Node(arrays[i][0], i, 0));
}
}
Node node;
// O((N - n)log n)
while (!minHeap.isEmpty()) {
node = minHeap.poll();
result.add(node.item);
if (node.itemIndx + 1 < arrays[node.arrIndx].length) {
minHeap.offer(new Node(arrays[node.arrIndx][node.itemIndx + 1], node.arrIndx, node.itemIndx + 1));
}
}
return result;
}
时间复杂度是O(N log n)
数组n
的N
数量和这些数组中所有元素的数量。