39. 组合总和
给定一个无重复元素的正整数数组
candidates
和一个正整数 target
,找出 candidates
中所有可以使数字和为目标数 target
的唯一组合。candidates
中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。对于给定的输入,保证和为
target
的唯一组合数少于 150
个。示例 1:
输入:candidates =[2,3,6,7],target =7输出:[[7],[2,2,3]]
示例 2:
输入:candidates = [2,3,5],target = 8 输出:[[2,2,2,2],[2,3,3],[3,5]]
示例 3:
输入:candidates =[2],target = 1 输出:[]
示例 4:
输入:candidates =[1],target =1输出:[[1]]
示例 5:
输入:candidates =[1],target =2输出:[[1,1]]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate
中的每个元素都是独一无二的。
1 <= target <= 500
通过次数321,301提交次数441,990
法1 回溯
思路
同组合类似,只不过上一题是找个数为k的组合,本题是找和为target的组和。
本题目对于同一元素可以取无限个,所以不能对和进行剪枝
题解
class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: self.res = [] self.backtrack(path=[], sum_=0, target=target, candidates=candidates, start=0) return self.res def backtrack(self, path, sum_, target, candidates, start): if sum_ == target: self.res.append(path[:]) return elif sum_ > target: return for i in range(start, len(candidates)): sum_ += candidates[i] path.append(candidates[i]) self.backtrack(path, sum_, target, candidates, i) sum_ -= candidates[i] path.pop()