组合总和
题目描述:
给定一个无重复元素的数组 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]
]
解题思路:
利用动态规划和递归的思想来解题
- 首先要将目标数组进行排序,然后使用函数
combinationSum_solve()
来解题 - 在函数
combinationSum_solve()
中,candidates
代表目标数组,target
表示目标数,start
表示遍历目标数组的开始位置,如果已经遍历过的数字,则start
自动往后移动,valuelist
用来存储满足题目要求的数字 - 遍历的过程就是看当前数字是否比
target
小,如果是,则添加入valuelist
,然后继续遍历,此时开始位置为当前位置,此时的target
变成target - candidates[i]
,即开始找有没有与valuelist
中数字可以相加等于target
的数字
Python源码:
from typing import List
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
Solution.analist = []
self.combinationSum_solve(candidates, target, 0, [])
return Solution.analist
def combinationSum_solve(self, candidates, target, start, valuelist):
if target == 0:
return Solution.analist.append(valuelist)
for i in range(start, len(candidates)):
if candidates[i] > target:
return
self.combinationSum_solve(candidates, target - candidates[i], i, valuelist + [candidates[i]])
欢迎关注我的github:https://github.com/UESTCYangHR