我试图弄清楚如何将包含几行不均匀大小的2D
int数组合并到Java中的一个已排序的1D int数组中。
例如,如果我的2D数组类似于[[2, 8], [16, 35], [1, 4], [5, 7, 19]]
,它将合并为已排序的1D数组[1, 2, 4, 5, 7, 8, 16, 19, 35]
。
我的函数的标题如下所示,半排序的2D数组和被分类的1D数组是参数:
public void mergeTo1D(int[][] sorted, int[] origArray) {
// Code goes here
}
我在这里看到了一些使用min-heap的解决方案,但我不知道如何实现或使用它,因为我刚刚开始学习数据结构。
答案 0 :(得分:2)
我相信您可以使用k向合并(这是合并排序的概括)。
这里具有n个排序列表,最大大小为k。 保留包含每个列表中最小元素的最小堆。另外,保留结果列表。
然后,每次弹出堆的最小值。将此数字设为x,并说它是从第i行获取的。将x附加到结果列表,然后将第i行中的下一个数字添加到最小堆中(如果存在该数字)
重复此操作,直到遍历所有阵列为止。
复杂度为O(n k logn)-考虑到要对n * k个元素进行排序,并且需要遍历所有元素,效率非常高。