【发布时间】:2021-10-21 17:26:13
【问题描述】:
给定一个包含 N 个数字的数组(不一定是排序的)。我们可以将任意两个数字合并为一个,合并这两个数字的成本等于两个值的总和。任务是找到合并所有数字的最小总成本。
示例:
设数组 A = [1,2,3,4]然后,我们可以删除 1 和 2,将它们相加并将总和保留在数组中。此步骤的成本为 (1+2) = 3。
现在,A = [3,3,4],成本 = 3
在第二步中,我们可以将 3 和 3 相加,并将总和保留在数组中。此步骤的成本为 (3+3) = 6。
现在,A = [4,6],成本 = 6
在第三步中,我们可以从数组中删除两个元素并将总和再次保留在数组中。此步骤的成本为 (4+6) = 6。
现在,A = [10],成本 = 10
所以,总成本是 19 (10+6+3)。
我们必须选择 2 个最小的元素来最小化我们的总成本。一个简单的方法是使用最小堆结构。我们将能够在 O(1) 中获得最小元素,插入将是 O(log n)。
这种方法的时间复杂度是 O(n log n)。
但我尝试了另一种方法,但无法找到失败的情况。基本思想是,我们将在任何时候选择的两个最小元素的总和总是大于之前选择的一对元素的总和。因此“temp”数组将始终被排序,并且我们将能够访问 O(1) 中的最小元素。
当我对输入数组进行排序然后简单地遍历数组时,我的方法的复杂性是 O(n log n)。
int minCost(vector<int>& arr) {
sort(arr.begin(), arr.end());
// temp array will contain the sum of all the pairs of minimum elements
vector<int> temp;
// index for arr
int i = 0;
// index for temp
int j = 0;
int cost = 0;
// while we have more than 1 element combined in both the input and temp array
while(arr.size() - i + temp.size() - j > 1) {
int num1, num2;
// selecting num1 (minimum element)
if(i < arr.size() && j < temp.size()) {
if(arr[i] <= temp[j])
num1 = arr[i++];
else
num1 = temp[j++];
}
else if(i < arr.size())
num1 = arr[i++];
else if(j < temp.size())
num1 = temp[j++];
// selecting num2 (second minimum element)
if(i < arr.size() && j < temp.size()) {
if(arr[i] <= temp[j])
num2 = arr[i++];
else
num2 = temp[j++];
}
else if(i < arr.size())
num2 = arr[i++];
else if(j < temp.size())
num2 = temp[j++];
// appending the sum of the minimum elements in the temp array
int sum = num1 + num2;
temp.push_back(sum);
cost += sum;
}
return cost;
}
这种方法正确吗?如果没有,请告诉我我缺少什么,以及该算法失败的测试用例。
【问题讨论】:
-
这种方法正确吗? -- 你怎么知道你的程序是否有逻辑错误?仅仅因为它编译并不意味着它没有错误。算法仅与编写的假定实现算法的程序一样好。比如Djikstra的最短路径算法是没有bug的,但是如果我实现不正确,那么问题就出在实现上,而不是算法上。
-
欢迎来到 Stack Overflow。请阅读the help pages,接受SO tour,阅读How to Ask,以及this question checklist。最后,请不要发送垃圾邮件无关的标签。例如,这个问题与 Python 有什么关系?
-
我无法在我的方法中找到逻辑错误,这就是我发布问题的原因。我想知道我的方法在逻辑上是如何错误的。
-
但我尝试了另一种方法...... -- 好吧,你承担了这个负担,而不是坚持你声称有效的实现(使用堆)。如果您的算法失败,则无需 C++ 代码来证明它可能会失败。在你写一行代码之前,它应该已经在纸上很明显了。
-
我在纸上尝试了多个测试用例,每次都得到正确答案,但是当我尝试在 SPOJ 上提交实现的代码时,结果是 WA。我只想知道我的算法无法给出正确结果的情况。如果您能在这方面帮助我,那就太好了。
标签: c++ arrays algorithm data-structures