![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/443b9352ef79525444cfca7f76c25bfd.png)
1.回溯法
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
# 看到所有可能的组合--回溯法
# 回溯法三步走
result = []
self.backtracking(result, n, k, 1, [])
return result
def backtracking(self, result, n, k, index, subset):
"""
result:存储所有可能的组合,并返回
n, k:必要参数
index:从哪开始遍历
subset:子集
"""
# 先是函数终止条件
if len(subset) == k:
res = subset[:] # 避免引用传递
result.append(res)
return
# 单层搜索过程
for i in range(index, n+1):
subset.append(i)
self.backtracking(result, n, k, i+1, subset)
# 回溯法重要的一步,回溯
subset.pop()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b9ed1efb56f9b28ed48d7a9b52f78e1a.png)
2.回溯法优化–+剪枝
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
# 看到所有可能的组合--回溯法
# 回溯法三步走
result = []
self.backtracking(result, n, k, 1, [])
return result
# 回溯优化--剪枝
# 修改的代码不多,for循环的界限上
def backtracking(self, result, n, k, index, subset):
if len(subset) == k:
result.append(subset[:])
return
# 剪枝操作的界限--n-(k-len(subset))+1
# 下面之所以+2,是因为数组为[1,n],range()为前闭后开,想取到n,就是n+1
for i in range(index, n-(k-len(subset))+2):
subset.append(i)
self.backtracking(result, n, k, i+1, subset)
subset.pop()