这道题是一道递归的题,递归终止条件是加和为target。
以题目中的输入为例,candidates = [2,3,5], target = 8
首先往结果列表中加入2,列表就变为了[2],那么现在的target就是6,那么问题就变为了candidates = [3,5], target = 6这个问题了。而由于结果中元素可以重复,所以要重复加很多次相同元素,直到当前加和大于target。依次递归,直到求到和为target的列表序列。
这道题还涉及到剪枝,我这里用了两个剪枝。
- 求target的时候,不能用比上层递归时用的元素小的元素,所以我这里将candidates进行了排序,在每次递归时将candidates切片,从而去掉比上层递归时用的元素小的元素。
- 当candidates中最小的元素都比target要大的时候,直接剪枝。
class Solution:
def solve(self, candidates: List[int], target: int) ->List[List[int]]:
l = len(candidates)
tmp = 0 #用于储存当前的加和数值
tmp_l = [] #用于储存当前list
result = []
for i in range(l):
tmp = 0
tmp_l = []
while tmp < target:
tmp += candidates[i]
tmp_l.append(candidates[i])
if tmp == target:
result.append(tmp_l)
continue
if i != l - 1 and target-tmp < candidates[i]: #剪枝
break
res_l = self.solve(candidates[i+1: ], target-tmp)
if res_l:
for res in res_l:
result.append(tmp_l+res)
return result
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
solution = Solution()
result = solution.solve(candidates, target)
return result