组合总和III
1.解法
首先看到这道题,先想到的是穷举所有情况,看是否有满足情况的答案。但是穷举也需要一个数值范围,因为组合中只允许含有 1 - 9 的正整数,所以我们可以先简单的将范围定为[1,9],所以该题目就变为了,从[1,9]中选k个数,使得这k个数的总和为n。这就变为了我之前博客中提到的组合问题了。
所以我们可以写出代码:
def combinationSum3(k, n):
result = [] # 用来存放最终答案
path = [] # 用来存储当前情况
def backtracking(n,k,startindex):
if len(path)==k:
if sum(path)==n:
path1 = path.copy()
result.append(path1)
return
for i in range(startindex,10):
path.append(i)
backtracking(n,k,i+1)
path.pop()
backtracking(n,k,1)
return result
2.优化
有两个地方可以优化:
-
如果剩余的元素个数少于还没选到的元素个数,那就不用选了。这点和组合问题是一样的。
-
首先已经选到的元素的总和已经大于了n,那么也没必要选了。
所以优化后的代码为:
def combinationSum3(k, n):
result = [] # 用来存放最终答案
path = [] # 用来存储当前情况
def backtracking(n,k,startindex):
if sum(path)>n: # 剪枝2
return
if len(path)==k:
if sum(path)==n:
path1 = path.copy()
result.append(path1)
return
for i in range(startindex,9-(k-len(path))+2): # 剪枝1
path.append(i)
backtracking(n,k,i+1)
path.pop()
backtracking(n,k,1)
return result
3.总结
组合问题的剪枝方法就是:n-(k-len(path))+1