Esta es una pregunta de entrevista clásica. Otro problema similar es «fusionar k listas ordenadas».
Este problema se puede resolver utilizando un montón. La complejidad del tiempo es O (nlog (k)), donde n es el número total de elementos yk es el número de matrices.
Se necesita O (log (k)) para insertar un elemento en el montón y se necesita O (log (k)) para eliminar el elemento mínimo.
class ArrayContainer implements Comparable<ArrayContainer> { int[] arr; int index; public ArrayContainer(int[] arr, int index) { this.arr = arr; this.index = index; } @Override public int compareTo(ArrayContainer o) { return this.arr[this.index] - o.arr[o.index]; } } |
public class KSortedArray { public static int[] mergeKSortedArray(int[][] arr) { //PriorityQueue is heap in Java PriorityQueue<ArrayContainer> queue = new PriorityQueue<ArrayContainer>(); int total=0; //add arrays to heap for (int i = 0; i < arr.length; i++) { queue.add(new ArrayContainer(arr[i], 0)); total = total + arr[i].length; } int m=0; int result[] = new int[total]; //while heap is not empty while(!queue.isEmpty()){ ArrayContainer ac = queue.poll(); result[m++]=ac.arr[ac.index]; if(ac.index < ac.arr.length-1){ queue.add(new ArrayContainer(ac.arr, ac.index+1)); } } return result; } public static void main(String[] args) { int[] arr1 = { 1, 3, 5, 7 }; int[] arr2 = { 2, 4, 6, 8 }; int[] arr3 = { 0, 9, 10, 11 }; int[] result = mergeKSortedArray(new int[][] { arr1, arr2, arr3 }); System.out.println(Arrays.toString(result)); } } |