第39题:组合总和
1.题目链接
[https://leetcode-cn.com/problems/combination-sum/]
2.题目内容
给定一个无重复元素的数组 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]
]
3.解题思路
本题对数组进行求和,并且数组中元素可以多次使用:
(1)首先想办法实现两个数组的求和
a = [2,3]
target = 12
m = target//a[0]
n = target//a[1]
res = []
for i in range(m+1):
for j in range(n+1):
if a[0]*i + a[1]*j == target:
res.append([a[0]]*i + [a[1]]*j)
print(res)
# [[3, 3, 3, 3], [2, 2, 2, 3, 3], [2, 2, 2, 2, 2, 2]]
# 以上并非递归的正确方法,可以采用以下的递归总结规律。
a = [2,3]
target = 12
m = target//a[0]
n = target//a[1]
res = []
for i in range(m+1):
target1 = target - a[0] * i
if target1 == 0:
res.append([a[0]] * i)
elif target1 < 0:
break
else:
for j in range(n+1):
target2 = target1 - a[1] * j
if target2 == 0:
res.append([a[0]] * i + [a[1]] * j)
print(res)
4.代码实现
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
n = len(candidates)
if n == 0:
return []
if candidates[0] > target:
return []
re = []
for i in range(n):
nu=candidates[i:]
temp=target-candidates[i]
res=[candidates[i]]
if temp==0:
re.append(res)
elif temp<0:
break
else:
a=self.combinationSum(nu,temp)
for k in a:
k=res+k
re.append(k)
return re