找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]
示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]
# 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
# 说明:
# 所有数字都是正整数。
# 解集不能包含重复的组合。
# 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]
# 示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]
class Solution:
# 定义一个组合函数,参数为k和n
def combin(self,k,n):
# 定义一个回溯函数,参数为sum、target、startindex和path
def backtracking(sum,target,startindex,path):
# 如果sum等于target且path的长度等于k,则将path添加到res中
if sum == target and len(path) == k:
res.append(path[:])
return
# 遍历从startindex到10的数字
for i in range(startindex,10):
# 将i加到sum中
sum += i
# 将i添加到path中
path.append(i)
# 递归调用backtracking函数,参数为sum、target、i+1和path
backtracking(sum,target,i+1,path)# i+1 避免重复
# 将i从sum中减去
sum -= i
# 将i从path中移除
path.pop()
# 定义一个空列表res
res = []
# 调用backtracking函数,参数为0、n、1和空列表
backtracking(0,n,1,[])
# 返回res
return res
if __name__ == '__main__':
# 创建Solution类的实例s
s = Solution()
# 打印s.combin(3,7)的结果
print(s.combin(3,7))