子集逻辑,跳过所有其他元素

时间:2017-01-08 20:33:35

标签: java

给定一组int,是否可以选择一组int中的一组,以便该组使用此附加约束求和给定目标:如果数组中的值选择在组中,不得选择紧跟在数组后面的值。 (不需要循环。)

groupNoAdj(0,[2,5,10,4],12)→true

groupNoAdj(0,[2,5,10,4],14)→false

groupNoAdj(0,[2,5,10,4],7)→false

我想知道是否还有什么要补充的,不太确定错误在哪里:

public boolean groupNoAdj(int start, int[] nums, int target) {
    if (start == nums.length) {return (target == 0);}

    if (groupNoAdj(start + 1, nums, target - nums[start])){
    return true;
  }

    if (groupNoAdj(start + 1, nums, target)){
      return (groupNoAdj(start + 1, nums, target));
    } 

    return false;
}

1 个答案:

答案 0 :(得分:0)

以下是对代码的修改:

public boolean groupNoAdj(int start, int[] nums, int target) {

        if (start >= nums.length) {return (target == 0);}  //neded to change to '>=' because start can go over length of array 

//in your code you return true when the two following numbers from array are chosen, which is contrary to the requirement of the task 
        if (groupNoAdj(start + 2, nums, target - nums[start])){ 
            return true;
        }

        if (groupNoAdj(start + 1, nums, target)){
            return true;
        } 

        return false;
    }

这里是全新的代码,例如输入(array = [1,2,3,4,5]和target 99),递归调用函数groupNoAdj只有12次而不是25次。

    public boolean groupNoAdj(int start, int[] nums, int target) {
        if(target - nums[start] == 0) // there is no need let 'start' be greater than the lenghth of nums' array 
            return true;

  //doing what in the previous code but I am not letting to call function with start greater than the length of nums' array
        if (!(start + 2 >= nums.length) && groupNoAdj(start + 2, nums, target - nums[start])){
            return true;
        } 

        if (!(start + 1 == nums.length) && groupNoAdj(start + 1, nums, target)){
            return true;
        }

        return false;
    }      

这种递归背后的逻辑:我正在检查所有可能的总和(我假设一个数字也是总和)来自数组列表,除了两个数字彼此“相邻”的情况。 如果您对此代码有任何疑问,请询问。 这不是解决这个问题的方法,你必须简单地练习,练习和练习更多,你会看到如何解决这个问题。