题目:
题解:
从题目可以看出是找所有组合的问题,因此就想起用递归,回溯的方法来求解。
我们首先对数组进行排序,这样方便查找。
代码思路:
进行回溯的过程中,我们通过更新target来寻找合适的组合。
即我们每次选取一个元素,就从target中减去这个元素,然后利用减去后的差来更新target。
在进行回溯的过程中,我们需要确定回溯的数组范围,因此我们引入索引index,因为可以重复选择,所以index值等于当前的索引i。
图解思路:
代码:
class Solution:
def combinationSum(self, candidates, target):
index = 0
result = []
temp = []
de = target
candidates.sort()
def dfs(target,index,temp):
# print('de: %d' % de)
# print('sum: %d' % sum(temp))
if sum(temp) == de:
result.append(temp)
# print(result)
# temp = []
for i in range(index,len(candidates)):
# print('i: %d' % i)
if target > candidates[i]:
# temp.append(candidates[i])
# print("######")
# print('i: %d' % i)
# print('temp:',temp)
dfs(target - candidates[i],i,temp + [candidates[i]])
elif target == candidates[i]:
# print("444444")
# temp.append(candidates[i])#这个时候不能再往后进行遍历了,因为后面的数都大于target,
dfs(target - candidates[i],i,temp + [candidates[i]])
elif target < candidates[i]:#如果小于,本次递归结束,就回溯到上一次,继续遍历
# print("******")
# dfs(target + candidates[i],i + 1, temp)
break
dfs(target,index,temp)
# print(result)
return result
来源:CSDN
作者:chenyy__
链接:https://blog.csdn.net/cy_believ/article/details/104449099