在2D数组中找到所有可能的总和 - C ++

时间:2017-01-15 09:05:05

标签: arrays sum c++14

我有像这样的2D数组

1 2
3 4

我需要从中获得所有可能的总和,在上面的例子中结果将是:

1 2 3 4 5 6 7 8 9 10

任何想法?

1 个答案:

答案 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阵列输入,以及如果数百万客户端需要使用此算法在世界各地。