问题描述
问题出在这里
有n个非负整数。我们想适当地增加或减少这些数字以得出目标数字。例如,要使数字1等于[1,1,1,1,1],可以使用以下五种方法:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
编写解决方案函数,以数组编号,目标编号和目标作为参数给出时,通过适当地增加和减去这些数字来返回生成目标编号的方法。
限制
- 给出的数字是2个或20个以下。
- 每个数字都是1到50之间的自然数。
- 目标数字是1到1000之间的自然数。
I / O示例
numbers: [1,1,1]
target: 3
return: 5
方法
1
/ \
-1 1
/ \ / \
-1 1 -1 1
-1 1 1 3
以DFS方式找到了这种方法,检查所有情况,如果数字的组合等于目标数字,则进行加法或减法计算。
以下代码:
def solution(numbers,target):
total = 0
num_len = len(numbers)
def dfs(index=0):
if index < num_len:
numbers[index] *= 1
print('positive / index',index,numbers)
dfs(index + 1)
numbers[index] *= -1
print('negative / index',numbers)
dfs(index + 1)
else:
if sum(numbers) == target:
nonlocal total
total += 1
print('matched / index',numbers)
dfs()
return total
但是,我想知道它如何运行,控制台日志记录也是如此。
positive / index 0 [1,1]
positive / index 1 [1,1]
positive / index 2 [1,1]
positive / index 3 [1,1]
positive / index 4 [1,1]
negative / index 4 [1,-1]
matched / index 5 [1,-1]
negative / index 3 [1,-1,-1] ### how come this index all of sudden becomes 3? ###
positive / index 4 [1,-1]
...
我有点理解直到索引匹配递归/索引5的增量 但不太确定为什么下次会变成3。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)