合并k个有序数组

// 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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值