【问题标题】:Returning a specific sum from an array of integers non-recursively [closed]以非递归方式从整数数组返回特定​​总和 [关闭]
【发布时间】:2015-09-22 01:36:49
【问题描述】:

我在为这样的问题寻找解决方案时遇到了问题:

数组 = [5, 10, 10, 15, 21]

需要数 = 46

返回结果 = [10, 15, 21] 或 [5, 10, 10, 21]

有没有一种非递归的方式来返回数组中加起来为 36 的整数组合?我试图使实现尽可能简单。

【问题讨论】:

  • 有什么问题?
  • 数组总是有序的吗?如果是这样,您可以进行一些二进制搜索并找到答案。对于长数组非常有用
  • 数组并不总是有序的。问题是实现一个解决方案,找到这些数字的每一个组合并返回加起来为 requiredNumber 的集合。
  • 根据您要搜索该数组的大小和次数,您应该首先考虑对其进行排序

标签: java arrays list sum combinations


【解决方案1】:

我认为您正在寻找的是一种“从一组值中查找所有组合的非递归方式”

这是一种方式,在概念上:

设置一个位,其位数等于您的值集中的元素数。例如,对于 5 元素数组的情况,您需要 5 位。

(查看您的位设置为整数)从 0 开始,并保持递增。对于每个值,您都会得到一组组合。

例如

array = [1,2,3,4,5]
for (bits 0b00000 to 0b11111) {
    sum array base on bits (only sum if corresponding bits turned on)

    if sum equals to desired value, then return 
}

如果您确定您的数组小于 31/63 个值,那么使用 int/long 将非常简单。如果您想要更长的数组,使用 BigInteger(或可能是 BitSet)来实现此目的仍然很容易。

一个硬编码值的例子,但它应该给你的想法(还没有编译,请忍受语法错误:P):

int[] array = new int[]{1,2,3,4,5};

for (int bits = 0; bits < 32; ++bits) {  // bits < 2^5
    System.out.print("[");
    for (int i = 0; i < 5; ++i) {
       if ((bits & 1 << i) != 0)  {   // i-th bit is ON
           System.out.print(" " + array[i]);
       }
    }
    System.out.println(" ]");
}

上面的代码应该给你所有的组合。更改为您想要做的事情应该是微不足道的(找到具体的总和)

【讨论】:

  • 谢谢!您在第一个 for 循环中选择位
  • 因为它是 2^5,其中 5 是数组的大小。请记住,对于长数组,您的问题的解决方案可能真的很慢
  • @EduardoJavierHuertaYero 可能真的很慢,因为...?创建了过多的 BigInteger 对象?这可能是一个问题,但可以通过在 BitSet 上实现“增量”逻辑来轻松解决。还是您指的是任何可能很慢的原因? (与递归方法相比,我想不出任何方法)
  • 对不起,我应该更明确一点。我指的是迭代次数。对于有几千个元素的数组,完成外循环需要一段时间
  • @EduardoJavierHuertaYero 使用递归不会更好,因为递归达到基本情况的次数与我们在此处进行的迭代次数相同。
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 2018-10-10
  • 2021-04-19
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2013-11-17
相关资源
最近更新 更多