题目描述:
Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
The same repeated number may be chosen from candidates unlimited number of times.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
Example 2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
题目大意:
- 给定一个数组,全部是正整数,作为候选者,再给定一个目标,找出候选者,就是那些数的组合,使之加起来等于目标数,每个数可用次数不限
解题思路:
- 首先打眼一看,这是一个数组间的组合,加和等于一个目标数的问题,不过就是每个数可以用多次,而且还有可能有多个数相加等于target
- 个人想法是,只要是加和等于一个数的问题,就可以用 target-数组中的数=n,这个公式作为突破口,这个n要么就直接存在数组中,要么就是数组中其他数的加和
- 所以只要将这个公式循环下去,并且在每一个数下面都要做,最后发现n=0时,那就是说明之前循环所经历的数,就是我们要找的
- 如果发现n<0,就说明这种组合在所给定的数组中不存在,不是我们要找的,如果n>0,那就继续做差下去,说明没找完
- 有了想法,如何用程序实现这个想法,也是一个挑战啊
少废话,上代码:
class Solution:
def combinationSum(self, candidates, target):
candidates.sort()#升序排列数组,方面后面的判定条件的执行,且如遇数组的问题,经验建议首先进行排序操作
ans = []#设置答案列表
#定义一个查找函数
def find(n=target, lt=[]):#两个参数,一个是初始值,一个用来装答案的子集
if n == 0:#遇到n等于0了,说明有数符合条件了,下面进行去重操作
lt.sort()
if lt not in ans:#不在里面,才算一个有效答案
ans.append(lt)
else:#否则,要进行向下去找数
for i in candidates:#遍历每一个数,将所有可能的数都找出来
if n < 0:#发现小于0,则数据不对,直接跳出循环
break
else:
find(n-i, lt+[i])#继续做差,直到等于0,才算一个有效答案
find()
return ans
运行时间和内存使用:
- Runtime: 720 ms, faster than 5.03% of Python3 online submissions for Combination Sum.
- Memory Usage: 14 MB, less than 6.06% of Python3 online submissions for Combination Sum.