昨天面試被問到這道算法題,一時沒有回答上來,今天思考了一下,參閱了網上的教程,作了一個JAVA版本的實現。java
方案一:node
新建一個N*L的數組,將原始數組拼接存放在這個大數組中,再調用Arrays.sort()進行排序,或者使用其它排序方法便可。面試
此方法時間複雜度爲o(N*Llog2N*L);算法
具體代碼實現以下:數組
import java.util.Arrays; class Solution { public static int[] MergeArrays(int[][] array) { int N = array.length, L; if (N == 0) return new int[0]; else { L = array[0].length; for (int i = 1; i < N; i++) if (L != array[i].length) return new int[0]; } int[] result = new int[N * L]; for (int i = 0; i < N; i++) for (int j = 0; j < L; j++) result[i * L + j] = array[i][j]; Arrays.sort(result); return result; } }
方案二:ide
使用PriorityQueue實現最小堆,須要定義一個指針數組,用於保存這N個數組的index,定義Node類用於保存當前數值(value)和該數字所在的數組序號(idx),而且覆寫Comparetor<Node>的compare方法實現自定義排序。PriorityQueue的offer()和poll()方法時間複雜度均爲logn。this
思路:首先將N個數組的第一位放到PriorityQueue,循環取出優先隊列的首位(最小值)放入result數組中,而且插入該首位數字所在數組的下一個數字(若是存在),直到全部數字均被加入到result數組即中止(N*L)次。spa
時間複雜度:O(N*LlogN)指針
空間複雜度:O(N)code
代碼實現:
import java.util.PriorityQueue; import java.util.Arrays; import java.util.Comparator; public class SortedArraysMerge { static class Node { int value; int idx; public Node(int value, int idx) { this.value = value; this.idx = idx; } } public static int[] MergeArrays(int[][] arr) { int N = arr.length, L; if (N == 0)//此時傳入數組爲空 return new int[0]; else {//判斷數組是否符合規範 L = arr[0].length; for (int i = 1; i < N; i++) if (arr[i].length != L) return new int[0]; //此時數組不規範 } int[] result = new int[N * L]; int[] index = new int[N]; Arrays.fill(index, 0, N, 0); PriorityQueue<Node> queue = new PriorityQueue<Node>(new Comparator<Node>() { @Override public int compare(Node n1, Node n2) { if (n1.value < n2.value) return -1; else if (n1.value > n2.value) return 1; else return 0; } }); for (int i = 0; i < N; i++) { Node node = new Node(arr[i][index[i]++], i); queue.offer(node); } System.out.println("" + queue.size()); int idx = 0; while (idx < N * L) { Node minNode = queue.poll(); result[idx++] = minNode.value; if (index[minNode.idx] < L) { queue.offer(new Node(arr[minNode.idx][index[minNode.idx]], minNode.idx)); index[minNode.idx]++; } } return result; } }