leetcode第三十九题—组合总和
2020-03-04 本文已影响0人
不分享的知识毫无意义
这道题是回溯法,所谓回溯法就是根据条件来判断,对于不满足条件的向上回溯。
1.题目
原题
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
例子
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[ [7], [2,2,3]]
2.解析
这道题的难点就在于元素可以重复选取。
最开始考虑的是遍历,判断数据情况,想想太麻烦了,可以用回溯法+递归解决。
回溯的关键就是建立一个递归函数,赋予一个起始位置,然后开始依次走遍历,注意定义一个保留满足条件元素的列表,用于去附加满足条件的数组。
代码就不一一解释了,可以自己看。
3.python代码
class Solution:
def combinationSum(self, candidates, target):
if len(candidates) < 1:
return
self.candidates = candidates
self.candidates.sort()
self.curset = []
self.target = target
self.lenc = len(candidates)
self.dfs(0, 0, [])
return self.curset
def dfs(self, i, curtsum, cur):
if self.candidates[i] > self.target or i > self.lenc - 1:
return
if curtsum == self.target:
self.curset.append(cur)
return
for j in range(i, self.lenc):
if curtsum + self.candidates[i] > self.target:
break
self.dfs(j, curtsum+self.candidates[j], cur + [self.candidates[j]])