【问题标题】:Combination sum ,recursion组合和,递归
【发布时间】:2016-12-19 13:19:55
【问题描述】:

我想递归地找到数组 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]]

【问题讨论】:

  • 您的代码在哪里允许重复?是否在任务意图内多次使用相同的列表元素?

标签: java recursion arraylist combinations


【解决方案1】:

这一行

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

有问题。

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

【讨论】:

    【解决方案2】:

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

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

      3 3 2 2 2 3 3 3 3

    ... 你必须同时尝试 2 和 4 三分。 1 和 3 三分之三将无法找到更小的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2014-08-29
      • 2018-02-24
      • 2019-08-09
      • 1970-01-01
      • 2012-11-01
      • 2011-10-21
      相关资源
      最近更新 更多