我正在尝试解决leetcode 39组合问题。我发现算法将所有数字相加并减去最后一个数字。总是出错号码。
下面是我的解决方法。
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<> ();
// corner case
if (candidates == null || candidates.length == 0 || target == 0) return res;
dfsHelper(res, candidates, target, new ArrayList<> (), 0);
return res;
}
private void dfsHelper(List<List<Integer>> res, int[] candidates, int target, List<Integer> cur, int sum) {
// base case
if (sum == target) {
Collections.sort(cur);
System.out.println(target);
if (!res.contains(cur)) {
res.add(new ArrayList<> (cur));
}
return;
} else if (sum > target) {
return;
}
// recursion
for (int i = 0; i < candidates.length; i++) {
cur.add(candidates[i]);
sum += candidates[i];
System.out.println("****");
System.out.println(cur);
System.out.println(sum);
dfsHelper(res, candidates, target, cur, sum);
//recover
sum = sum - candidates[i];
cur.remove(cur.size() - 1);
}
return;
}
}
我使用一个目标为8,候选者为[2,3,5]的测试用例,并打印出所有curList和总和。
[2] 2
[2,2] 4
[2,2,2] 6
[2,2,2,2] 8 8
[2,2,2,3] 9
[2,2,2,5] 11
[2,2,3] 7
[2,2,3,2] 9
[2,2,3,3] 10
[2,2,3,5] 12
[2,2,5] 9
[2,3] 5
[2,3,2] 7
[2、3、2、2] 9
[2,3,2,3] 10
[2、3、2、5] 12
[2、3、3] 8 8
[2、3、5] 10
[2,5] 7
[2、5、2] 9
[2、5、3] 10
[2、5、5] 12
[3] 3
[3,2] 5
[3,2,2] 7
[3,2,2,2] 9
[3,2,2,3] 10
[3,2,2,5] 12
[3,2,3] 8 8
[2、3、5] 10
[2,3] 6
[2,3,2] 8 8
对于最后的输出,您可以轻松地发现Java进行了错误的计算。我想知道这是怎么发生的。