此题是自己的一个学习过程,真是第一次用PriortyQueue,如何定义一个class并在当中实现Comparable接口,如何用PriortyQueue的思维去处理问题。
在定义ArrayContainer中,一定要明确的是index到底代表什么,是自身数组的当前下标,而与[][]的循环无关,所以当中的第一个错误不应该。第二个错误,是告诉我们要处理边界条件。
整个思路参考:点击打开链接
/**
* @param arrays k sorted integer arrays
* @return a sorted array
*/
public List<Integer> mergekSortedArrays(int[][] arrays) {
// Write your code here
List<Integer> results = new ArrayList<>();
if (arrays == null || arrays.length == 0) {
return results;
}
PriorityQueue<ArrayContainer> pq = new PriorityQueue<>();
for (int i = 0; i < arrays.length; i++) {
2
if (arrays[i].length != 0) {
2
//1 ArrayContainer ac = new ArrayContainer(arrays[i], i);
ArrayContainer ac = new ArrayContainer(arrays[i], 0);
pq.add(ac);
}
}
while (!pq.isEmpty()) {
ArrayContainer ac = pq.poll();
results.add(ac.array[ac.index++]);
if (ac.index < ac.array.length) {
pq.add(new ArrayContainer(ac.array, ac.index));
}
}
return results;
}
private class ArrayContainer implements Comparable<ArrayContainer> {
int []array;
int index;
public ArrayContainer (int []array, int index) {
this.array = array;
this.index = index;
}
@Override
public int compareTo(ArrayContainer o) {
return this.array[index] - o.array[o.index];
}
}