algorithm - 从另一个数组中替换一个数组的元素以最小化第一个数组的总和

标签 algorithm sorting array-algorithms

<分区>

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

在进行这样的替换之后,数组 A[] 的最小总和是多少。

我的方法是:

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

但是我通过这种方法获得了 WA。

最佳答案

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

就目前而言,我会告诉你什么会起作用。

解决方案#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的方式.在这里,您将寻找 n 个最小元素,而不是寻找 median,并将此范围内的所有元素放入输出数组中。

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

关于algorithm - 从另一个数组中替换一个数组的元素以最小化第一个数组的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40435206/

相关文章:

C++从一个数组添加到另一个数组,每次我向另一个数组添加元素时查看另一个数组

c# - 枚举网格上 'rhombus' 形状的相邻单元格

arrays - 给定一个整数数组,在线性时间和常量空间中找到第一个缺失的正整数

javascript - 使用 JavaScript 的罗马数字转换器

algorithm - 比较两种算法的复杂度

sorting - 我想检查比较运算符是真还是假

php - 按键排序数组并反转结果

algorithm - 数据结构 : If Heaps are trees, 为什么它们在内部用列表或数组实现?

c++ - 如何在C++中将数组向左或向右移动?

arrays - 在 julia 中合并两个排序数组