【发布时间】:2021-02-11 13:06:48
【问题描述】:
任务的描述是这样的:
我们有 n 个数字,我们必须找到数组中所有对的唯一和的数量。
例如:
3 2 5 6 3
The sums of all the pairs(non-repeated) are 5 9 8 6 8 7 5 11 9 8
Unique are 5 9 8 6 7 11
Therefore output is 6
我想出了这个非常原始且耗时(即复杂性)的解决方案:
int n = 0;
cin >> n;
vector<int> vec(n);
for (int i = 0; i < n; i++)
{
cin >> vec[i];
}
vector<int> sum;
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
sum.push_back(vec[i] + vec[j]);
}
}
sort(sum.begin(), sum.end());
for (int i = 0; i < sum.size()-1;)
{
if (sum[i] == sum[i + 1]) sum.erase(sum.begin() + i);
else i++;
}
cout << endl << sum.size();
我觉得可以使用 Combinatorics 或更简单的方法来解决问题。我想了很多,什么也想不出来。所以我的要求是是否有人可以改进解决方案。
【问题讨论】:
-
您的最后一个循环可以替换为
std::unique。 -
@Someprogrammerdude 嗯,这是你教给我的一件有趣的事。我会利用它。否则,不知道如何通过时间复杂度以某种方式使解决方案变得更好?我觉得for的真的占了很多
-
此外,您可以轻松计算矢量
sum的元素数量,并在向其添加元素之前适当地保留或调整其大小。 -
或者您可以使用
std::set或std::unordered_set代替向量。 -
@DavidPetriashvili 这几乎就是集合的定义,是的。 (不幸的是,巨大的复杂性因素是二次加法循环。如果你想要真正的改进,那就是你需要关注的地方。不幸的是,我想不出任何聪明的东西......)
标签: c++ vector combinatorics