// 1,基于排序
申请数组,在数组内进行排序
// 2, 基于归并
// 感觉空间复杂度太大
public int[] mergeArrays(List<int[]> arrays) {
if (arrays == null || arrays.size() == 0) return new int[0];
return mergeArrays(arrays, 0, arrays.size()-1);
}
private int[] mergeArrays(List<int[]> arrays, int lo, int hi) {
if (lo >= hi) return arrays.get(lo);
int mid = lo + (hi - lo) / 2;
int[] nums1 = mergeArrays(arrays, lo, mid);
int[] nums2 = mergeArrays(arrays, mid+1, hi);
return mergeTwoArrays(nums1, nums2);
}
private int[] mergeTwoArrays(int[] nums1, int[] nums2) {
if (nums1 == null) return nums2;
if (nums2 == null) return nums1;
int n1 = nums1.length;
int n2 = nums2.length;
int[] res = new int[n1+n2];
int i = 0, j = 0;
for (int k = 0; k < n1+n2; k++) {
if (i >= n1) res[k] = nums2[j++];
else if (j >= n2) res[k] = nums1[i++];
else if (nums1[i] < nums2[j]) res[k] = nums1[i++];
else res[k] = nums2[j++];
}
return res;
}
// 3, 基于堆
private class Node {
public int[] array;
public int idx;
public Node(int[] array, int idx) {
this.array = array;
this.idx = idx;
}
}
public int[] mergeArrays(List<int[]> arrays) {
Queue<Node> pq = new PriorityQueue<>((node1, node2)->(node1.array[node1.idx] - node2.array[node2.idx]));
int len = 0;
for(int[] array : arrays) {
if (array == null || array.length == 0) continue;
len += array.length;
pq.offer(new Node(array, 0));
}
int[] res = new int[len];
int k = 0;
while (!pq.isEmpty()) {
Node curr = pq.poll();
res[k++] = curr.array[curr.idx];
curr.idx++;
if (curr.idx < curr.array.length) {
pq.offer(curr);
}
}
return res;
}
合并k个有序数组
最新推荐文章于 2022-12-11 07:00:00 发布