https://leetcode.cn/problems/combinations/
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
# 星级:☆☆☆
# 标签:回溯
# 回溯法三步走
# 1、递归函数的返回值以及参数
# 2、确定终止条件
# 3、单层递归(搜索)逻辑
# 组合其实是一种特殊的(长度固定)的子集。
# 元素无重不可复选
from copy import deepcopy
nums = [i for i in range(1, n + 1)]
path, result = [], [] # 子集组合排列回溯三剑客
def backtrack(start):
if len(path) == k:
result.append(deepcopy(path))
# 或者result.append(path[:])
return
# for i in range(start, n): # 未剪枝,可以不写上面的return
for i in range(start, n - (k - len(path)) + 1): # 剪枝,必须写上面的return
path.append(nums[i]) # 做选择
backtrack(i + 1) # 进入下一层回溯树
path.pop() # 取消选择
backtrack(0)
return result