39-组合总和

给定一个无重复元素的数组 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]
]

解法

核心思想:采用回溯算法

class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
begin, end = 0, len(candidates)
if end == 0:
return []
# 剪枝的前提是数组元素排序
# 深度深的边不能比深度浅的边还小
# 要排序的理由:1、前面用过的数后面不能再用;2、下一层边上的数不能小于上一层边上的数。
candidates.sort()
# 在遍历的过程中记录路径,一般而言它是一个栈
path, res = [], []
# 注意要传入 end ,在 range 中, end 取不到
self.helper(candidates, 0, end, path, res, target)
return res

def helper(self, candidates, begin, end, path, res, target):
# 先写递归终止的情况
if target == 0:
# Python 中可变对象是引用传递,因此需要将当前 path 里的值拷贝出来
# 或者使用 path.copy()
res.append(path[:])

for index in range(begin, end):
delta = target - candidates[index]
# “剪枝”操作,不必递归到下一层,并且后面的分支也不必执行
if delta < 0:
break
path.append(candidates[index])
# 因为下一层不能比上一层还小,起始索引还从 index 开始
self.helper(candidates, index, end, path, res, delta)
path.pop()

来源

LeetCode中该题地址,Click here!

-------------本文结束感谢您的阅读-------------