我有像这样的2D数组
1 2
3 4
我需要从中获得所有可能的总和,在上面的例子中结果将是:
1 2 3 4 5 6 7 8 9 10
任何想法?
答案 0 :(得分:0)
与大多数算法问题一样,有很多方法可以做到这一点。根据您为什么这样做,您最好自己做这个,以获得最大的好处。如果你仍然无法弄清楚,这是我自己的个人思考过程。
首先让代码变得更清晰,认识到c ++中的2D数组只是语法糖,你可以真正访问所有内容,就好像它是一维数组一样。
例如:
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”。您还可以使用dereference运算符进行操作,并发现有很多方法可以访问括号抽象出来的元素。
现在您可以线性访问所有内容,请考虑您的算法。看起来这与查找集合的每个子集非常相似,例如集合{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阵列输入,以及如果数百万客户端需要使用此算法在世界各地。