1. Combination Sum:
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3] ]可重复的使用Candidate中的数字,问有几种方式能让数字相加的结果等于target?
class Solution(object):
def combinationSum(self, candidates, target):
candidates = sorted(candidates)
result = [] #用于存放最终的结果
self.combination_sum(candidates,0,[],result,target)
return result
def combination_sum(self,nums,start,path,result,target): #path 表示当前的走过的路径
if not target:
result.append(path)
return
for i in range(start,len(nums)):
if i>start and nums[i]==nums[i-1]: #这一步,保证了得到的结果不会重复
continue
if nums[i]>target: #这一步,保证了即使i一直为0,也会跳出循环
return
self.combination_sum(nums,i,path+[nums[i]],result,target-nums[i]) #这里的start从i开始,使得同一个元素能够被使用多次。
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]不可重复的使用Candidate中的数字,问有几种方式能让数字相加的结果等于target?
只需要把上述代码的最后一行改为:
self.combine_sum_2(nums,i+1,path+[nums[i]],result,target-nums[i]) #start = i+1 保证在一个路径中,同一个元素不会被重复使用