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