从其他数组替换一个数组的元素以最小化第一个数组的总和

时间:2016-11-05 05:47:13

标签: algorithm sorting array-algorithms

我们给出了两个数组,大小为n的A []和另一个大小为m的数组B [],我们可以使用B []的元素替换A []中的任意数量的元素,B的每个元素[ ]只能使用一次来替换数组A []。

中的元素

进行此类替换后,数组A []的最小总和是什么。

我的方法是:

  • 排序数组A和B
  • 用A前面的元素替换A末尾的元素,直到B前面的元素小于A末尾的元素

然而,我正在通过这种方法获得WA。

2 个答案:

答案 0 :(得分:2)

您的算法无法正常工作。有可能在最终输出数组中保留相对较大的元素。我将在这里发布相关的测试用例。

就目前而言,我告诉它将起作用。

解决方案#1

排序后,这个问题只是合并排序的一个子问题。这与合并排序的合并步骤完全相同。

  • 排序AB
  • 合并AB,直到输出数组包含n个元素

合并的伪代码如下所示:

function merge(int[] A, int[] B):
    n := length(A)
    m := length(B)
    int[] output := new int[n]
    i := 0
    j := 0
    k := 0
    while i < n and j < m and k < n do
        if A[i] <= B[j]
            output[k] := A[i]
            i := i + 1

        else if A[i] > B[j]
            output[k] := B[j]
            j := j + 1

        k := k + 1

    end


    while i < n and k < n do
        output[k] := A[i]
        i := i + 1
        k := k + 1
    end


    while j < m and k < n do
        output[k] := B[j]
        j := j + 1
        k := k + 1
    end

return output

排序O(nlogn)和合并时间复杂度需要O(n)时间和O(n)空间。

解决方案#2 [更快的方法]

  • 排序数组AB
  • 通过二分搜索方法获取n个最小元素。这类似于finding median of two sorted array的方式。在这里,您不会找到median,而是选择n个最小元素,并在输出数组中获取此范围内的所有元素。

排序时间复杂度为O(nlogn),第二步时间为O(log(n + m))

答案 1 :(得分:0)

答案基本上是来自A和B的n + m个数字中最小的n个数字。 排序A - O(nlogn)和B - O(mlogm)。然后使用类似于mergesort算法合并的方法,找到这两个排序列表中的最小n个元素 - O(n)并填充数组A