我一直在思考这个问题已经有一段时间了,出于某种原因,它并没有让我头脑发热。如果我得到一个数组[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.
我在网上看到了一些答案,但它们似乎没有意义,我对别人的答案或代码并不感兴趣,我想学习如何思考正确的方法以便我能解决这些问题。我想知道是否有人可以指导我并帮助我解决这个问题,以及我应该如何思考解决这些问题。此时我并不十分担心效率,因为我甚至无法制定方法,因此欢迎所有方法。此外,我更喜欢使用数组和普通循环而不是任何其他数据结构,如哈希,因为我还没有学过这些。
答案 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,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}
}
}
依旧......