【问题标题】:Find all possible sums in 2D array - C++在二维数组中查找所有可能的和 - C++
【发布时间】:2017-01-15 09:05:04
【问题描述】:

我有一个这样的二维数组

1 2
3 4

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

1 2 3 4 5 6 7 8 9 10

有什么想法吗?

【问题讨论】:

  • @Peter 我尝试了很多东西,但没有解决办法

标签: arrays sum c++14


【解决方案1】:

与大多数算法问题一样,有很多方法可以做到这一点。根据你这样做的原因,你最好自己做这件事,以从中获得最大的好处。如果你还想不通,这里是我个人的思考过程。

首先要让代码更简洁,意识到 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 数组输入,以及如果数百万客户需要使用这个算法怎么办?全世界。

【讨论】:

  • 非常感谢,您的意思是我可以将我的二维数组表示为一维数组并获取所有可能的子数组,然后将它们添加到设置数据结构中,是吗?
  • @whitedemon 我不认为子数组是正确的术语。子数组意味着数字应该彼此相邻,在这里你真的想要子集(对于这个特定的解决方案)。但是,是的……差不多!
  • 对了,谢谢,我现在就试试这个,请问另一个问题,我使用的最大二维数组 300*300 这个算法能快速运行吗?
  • 尝试分析一下。查找每个子集是 O(2^N),因此 300x300 数组将产生 O(2^300*300) 堆栈调用。我认为这行不通...就像我说的那样,这是一种非常简单的解决方案,可以让您动起来。既然您有了想法,请尝试对其进行优化。
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 2019-04-18
  • 2017-03-27
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多