我们给出了两个数组,大小为n的A []和另一个大小为m的数组B [],我们可以使用B []的元素替换A []中的任意数量的元素,B的每个元素[ ]只能使用一次来替换数组A []。
中的元素进行此类替换后,数组A []的最小总和是什么。
我的方法是:
然而,我正在通过这种方法获得WA。
答案 0 :(得分:2)
您的算法无法正常工作。有可能在最终输出数组中保留相对较大的元素。我将在这里发布相关的测试用例。
就目前而言,我告诉它将起作用。
排序后,这个问题只是合并排序的一个子问题。这与合并排序的合并步骤完全相同。
A
和B
A
和B
,直到输出数组包含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)
空间。
A
和B
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