【发布时间】:2017-01-15 09:05:04
【问题描述】:
我有一个这样的二维数组
1 2
3 4
我需要从中获取所有可能的总和,在上面的示例中,结果将是:
1 2 3 4 5 6 7 8 9 10
有什么想法吗?
【问题讨论】:
-
@Peter 我尝试了很多东西,但没有解决办法
我有一个这样的二维数组
1 2
3 4
我需要从中获取所有可能的总和,在上面的示例中,结果将是:
1 2 3 4 5 6 7 8 9 10
有什么想法吗?
【问题讨论】:
与大多数算法问题一样,有很多方法可以做到这一点。根据你这样做的原因,你最好自己做这件事,以从中获得最大的好处。如果你还想不通,这里是我个人的思考过程。
首先要让代码更简洁,意识到 C++ 中的 2D 数组只是语法糖,您可以真正访问所有内容,就好像它是 1D 数组一样。
例如:
int x[2][2];
x[0][0] = 1;
x[0][1] = 2;
x[1][0] = 3;
x[1][1] = 4;
for (int i = 0; i < 4; i++) {
std::cout << x[0][i] << " ";
}
将打印出“1 2 3 4”。您还可以使用解引用运算符,发现有很多方法可以访问括号为您抽象掉的元素。
现在您可以线性访问所有内容,请考虑您的算法。看起来这与查找集合的每个子集非常相似,例如集合 {1,2,3,4} 的所有子集是:{}, {1}, {1,2}, {1, 2,3}, {1,2,4}, {1,3}, {1,3,4}, {1,4} {2}, {2,3}, {2,3,4}, {2,4}、{3}、{3,4}、{4}、{1,2,3,4}。然后要解决您的问题,只需将每个子集中的数字相加(不包括空集),我们得到 {1, 3, 6, 7, 4, 8, 5, 2, 5, 9, 6, 3, 7, 4 , 10}。
我看到一个问题,有些数字是重复的,例如 {2,3} 和 {1,4} 加起来都是 5。我们怎样才能摆脱这些?同样有很多方法,一种简单的方法是使用不允许重复的数据结构,例如 hashet(或 c++11 术语中的 unordered_set)。如果您需要原始问题中显示的从低到高排序的总和,请使用树集(或 c++ 集)而不是哈希集。
我们如何找到每个集合的所有子集?有很多方法可以做到这一点,如果您想不出解决方案,可以在线获得许多教程。
接下来想想算法的时间和空间复杂度以及一些好的测试用例。想想如果输入的 2D 数组太大以至于不能放在一台机器上,它将如何扩展,如何扩展以处理数百万个不同的 2D 数组输入,以及如果数百万客户需要使用这个算法怎么办?全世界。
【讨论】: