Description
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 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]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution 回溯
按照回溯的经典思路:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
很容易就能写出下列代码:
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
def backtrack(track):
if sum(track) > target: return
if sum(track) == target:
result.append(track[:])
return
for i in range(len(candidates)):
track.append(candidates[i])
backtrack(track)
track.pop()
backtrack([])
return result
但是此时得到的路径有重复的部分,测试用例[2,3,6,7] 7
,得到的结果是:[[2,2,3],[2,3,2],[3,2,2],[7]]
,此时要修改一下回溯的部分,将访问过的数字不在访问,可以将nums
放在backtrack里面就可以实现访问过的数字不再访问。
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
result = []
def backtrack(candidates, track):
if sum(track) > target: return
if sum(track) == target:
result.append(track)
return
for i in range(len(candidates)):
backtrack(candidates[i:], track + [candidates[i]])
backtrack(candidates, [])
return result
# 作者:zkk-c
# 链接:https://leetcode-cn.com/problems/combination-sum/solution/hui-su-fa-by-zkk-c-3/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。