题目:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
解答:
方法一:原始回溯
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res=[]
path=[]
def backtracking(low,high,target,k):
nonlocal res,path
if len(path)==k:
if sum(path)==target:
res.append(path[::])
return
#当前组合还需要几个数:k-len(path)=n-t+1
#打头数字的其实至多为:t=n-(k-len(path))+1
for i in range(low,high-k+len(path)+2):
path.append(i)
backtracking(i+1,high,target,k)
path.pop()
#范围:[1,n]
#k个数,目标和为n
backtracking(1,9,n,k)
return res
方法二:回溯+剪枝
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res=[]
path=[]
def backtracking(low,high,target,k,cursum):
nonlocal res,path
if cursum>target:
return
if len(path)==k:
if cursum==target:
res.append(path[::])
return
#当前组合还需要几个数:k-len(path)=n-t+1
#打头数字的其实至多为:t=n-(k-len(path))+1
for i in range(low,high-k+len(path)+2):
path.append(i)
cursum+=i
backtracking(i+1,high,target,k,cursum)
cursum-=i
path.pop()
#范围:[low,high],本题中为[1,9]
#k个数,目标和为n
backtracking(1,9,n,k,0)
return res
方法三:进一步优化
class Solution:
def combinationSum3(self, k: int, n: int) -> List[List[int]]:
res=[]
path=[]
def backtracking(low,high,target,k,cursum):
nonlocal res,path
if len(path)==k:
if cursum==target:
res.append(path[::])
return
#当前组合还需要几个数:k-len(path)=n-t+1
#打头数字的其实至多为:t=n-(k-len(path))+1
for i in range(low,high-k+len(path)+2):
if cursum+i<=target:
path.append(i)
backtracking(i+1,high,target,k,cursum+i)
path.pop()
else:
break
#范围:[low,high],本题中为[1,9]
#k个数,目标和为n
backtracking(1,9,n,k,0)
return res