描述
给出一个候选数字的set(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。
例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:
[7],
[2,2,3]
- 所有的数字(包括目标数字)均为正整数。
- 元素组合(a1, a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
- 解集不能包含重复的组合。
样例
给出候选set[2,3,6,7]和目标数字7
返回 [[7],[2,2,3]]
题目意思很明确了,这就是一个排列组合的问题,请注意,所有排列组合的问题,都用dfs来做!
这一题跟我写的上一题有类似的地方,详情请看:https://blog.csdn.net/wenqiwenqi123/article/details/80024729
但是因为这一题允许元素重复,所以下标在递归的时候不需要加一,具体代码如下:
<span style="color:#000000">class Solution:
"""
@param candidates: A list of integers
@param target: An integer
@return: A list of lists of integers
"""
def combinationSum(self, candidates, target):
# write your code here
def search(candidates,target,index,list):
if(sum(list)==target):
self.result.append(list)
return
if(index==len(candidates)):
return
if(sum(list)>target):
return
for i in range(index,len(candidates)):
search(candidates,target,i,list+[candidates[i]])
if(len(candidates)==0):
return []
self.result=[]
list=[]
search(sorted(candidates),target,0,list)
return self.result
s=Solution()
print(s.combinationSum([2,3,7],7))</span>
更新于2021.05.10 。我在两年后再刷这一题的时候发现给定的candidates不是set了,也就是说里面可能会出现重复的元素。
那么会出现一个什么问题呢?比如C=[1,1,2],T为3的时候,若是用之前的方法,则解集里会有两组解[1,2]与[1,2],第一个解中的1为C中第一个1,第二个解中的1为C中第二个1.为了避免这样的问题,其实只需要两行代码:
class Solution:
"""
@param candidates: A list of integers
@param target: An integer
@return: A list of lists of integers
"""
def combinationSum(self, candidates, target):
# write your code here
if (len(candidates)==0):
return []
self.results=[]
self.search(sorted(candidates),[],target,0)
return self.results
def search(self,candidates,S,target,index):
# if candidates[index]==target:
# self.results.append(S+[candidates[index]])
# return
if 0==target:
self.results.append(S)
return
if (index==len(candidates)):
return
if candidates[index]>target:
return
for i in range(index,len(candidates)):
# 避免重复解
if (i!=index and candidates[i]==candidates[i-1]):
continue
self.search(candidates,S+[candidates[i]],target-candidates[i],i)
# self.search(candidates,S+[candidates[index]],target-candidates[index],index+1)
# candidates = [2,3,6,7]
# target = 7
candidates = [2,2,3]
target = 5
s = Solution()
print(s.combinationSum(candidates,target))