组合总和,递归

时间:2016-12-19 13:19:55

标签: java recursion arraylist combinations

我想以递归方式找到数组nums []中的所有唯一组合,其中数字总和为给定的目标值。

private static List<List<Integer>> solve(int[] nums,int target) {
    List<List<Integer>> res = new ArrayList<>();
    if(nums == null || nums.length == 0) return res;
    Arrays.sort(nums);
    generate(res , new ArrayList<Integer>(),nums,target,0);
    return res;
}
private static void generate(List<List<Integer>> res, ArrayList<Integer> m, int[] nums,int target, int index) {
if(target == 0 ){
    res.add(m);
    return;
}
for(int i=index;i<nums.length ; i++){
    if(nums[i] > target) break;
    else{
        ArrayList<Integer> copy = new ArrayList<Integer>(m);
        copy.add(nums[i]);
        generate(res,copy,nums,target - nums[i],i+1);
        }
    }
}

但是当我尝试这个输入时,例如:

nums = {2,3,6,7} and target = 7;

我得到了

[[7]]

而不是预期的结果

[[2,2,3],[7]]

2 个答案:

答案 0 :(得分:0)

这一行

"generate(res,copy,nums,target - nums[i],i+1);"

有问题。

也许尝试将i + 1替换为i

答案 1 :(得分:0)

您只允许 nums 中每个值的一个实例。您需要以下两种解决方案之一:

  1. 不要在递归中自动增加 i ;让下一个电话接听相同的值。
  2. 使用内部循环测试范围1到目标// nums中的所有可能性。在给定的测试用例中,您需要尝试1和2个三分;以及后来的1,2和3两个。将目标更改为12,您将看到此更改的明显效果,包括以下低值解决方案:

    3 3 2 2 2 3 3 3 3

  3. ...你必须尝试使用​​2和4个三分球。 1和3三分之一将无法找到更小的解决方案。