给定数组中的元素找到与目标值相等的组合

时间:2014-09-12 15:07:39

标签: java arrays algorithm recursion

我一直在思考这个问题已经有一段时间了,出于某种原因,它并没有让我头脑发热。如果我得到一个数组[1,2,3,4]和目标值为5.我想从数组中获取所有可能的组合,以便它们添加到目标值。

所以我能想到的一种方法是

1!=5
1+2!=5
1+3!=5
1+4=5
//now check with combos of 3 digits.
1+2+3 !=5
1+2+4 !=5
//now check with combos of 4...however at this point i realized i missed the combination 1+3+4 also.

我在网上看到了一些答案,但它们似乎没有意义,我对别人的答案或代码并不感兴趣,我想学习如何思考正确的方法以便我能解决这些问题。我想知道是否有人可以指导我并帮助我解决这个问题,以及我应该如何思考解决这些问题。此时我并不十分担心效率,因为我甚至无法制定方法,因此欢迎所有方法。此外,我更喜欢使用数组和普通循环而不是任何其他数据结构,如哈希,因为我还没有学过这些。

1 个答案:

答案 0 :(得分:1)

既然你说过你想要的思维方式,这就是一种方式。

您可以通过各种假设

从最简单的案例开始

1)假设所有数组元素都小于目标值。 - 实施完成后,简单的验证将有所帮助。

高级别步骤

你需要找到一种方法来获得所有可能的数字排列。

然后添加排列的每个元素并检查总和是否匹配' destination' (这是一项更简单的任务)

现在正面临重大挑战:

如何获得所有可能的排列?

解决方法 让我们假设我们有一个单元素数组: 洗脱是显而易见的:)

接下来我们有一个包含两个元素的数组: 您确定数组的大小:2 您必须迭代此大小,因为您的组合将小于或等于此大小。 您的第一次迭代将具有值1.即。你正在寻找一个大小的组合 这很简单:你逐个迭代数组。

下一次迭代将查找大小为2的组合。 由于迭代值(2)等于数组(2)的大小,因此您知道只有一种可能的情况。

现在让我们处理一个大小为3的数组:

对于1号排列,你知道该怎么做。

对于3号排列,你知道这种组合是什么。

对于2号排列,你需要另一次迭代。 迭代数组,保持数组的当前元素并置换大小为2的数组的其余部分。

接下来迭代第二个然后第三个元素,并置换大小数组的其余部分(3-1 = 2)

<强> --------------------------------修订----------- ---------------------------------------

接下来让我们尝试一个包含4个元素的数组 让电话是A(4)

对于1号排列和4号排列,显而易见。

对于3号排列,您将重复处理为3号数组获得2号排列的过程。 你将持有一个元素,你将留下一个大小为3的数组。我们称之为A(3)

但请记住,您还需要大小为2的排列。您可以通过应用相同的可重用组件,从此大小为3的数组中确定大小为2的所有排列。这将成为一个递归调用。

基本上,你必须在大多数时间做一件事。

&#39;如果你有一个大小为n的数组; A(n),你需要迭代它,保持元素被迭代,你将有一个大小为n-1的数组; A(N-1)&#39;

然后再次进行递归调用。 并用粗线 1替换n

所以基本上你看到这会变成一个递归问题。

这是思考解决此问题的一种方法。我希望我能清楚地解释思考过程。

<强> ------------------------------------------例 - -----------------------------------------

假设我们有一个数组{1,2,3,4,5}

我们的功能看起来像

 function G (int[] array ) {
   Looping over array{ 
       remove array[index] from array
        you are left with restOfTheArray .// store it some where.
       then
          make a recursive call to G with restOfTheArray; 
     }
 }

循环的干运行:

 Dry run 1:
  funtion G (Array (n ) ) {
    Looping over {1,2,3,4,5}{ 
        first value while looping is 1, remove it from the array;
        you have {2,3,4,5}.// store it some where.
       then
          make a recursive call to G with {2,3,4,5}
     }
 } 


  Dry run 2: 
funtion G (Array (n ) ) {
   Looping over {1,2,3,4,5}{ 
       second value while looping is 2, remove it from the array;
        you have {1,3,4,5}.// store it some where.
       then
          make a recursive call to G with {1,3,4,5}
     }
 }

依旧......

现在让我们看一下递归调用的干运行:

  Dry Run 1.1
 funtion G (Array (n ) ) {
   Looping over {1,2,3,4,5}{ 
       First value while looping is 1, remove it from the array;
        you have {2,3,4,5}.// store it some where.
       then
          make a recursive call to G with {2,3,4,5}
     }
 }

 Dry Run 1.2 

 funtion G (Array (n ) ) {
   Looping over {2,3,4,5}{ 
       First value while looping is 2, remove it from the array;
        you have {3,4,5}.// store it some where.
       then
          make a recursive call to G with {3,4,5}
     }
 }

依旧......