题目
题目描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
题解
这个问题可以通过回溯算法(Backtracking)来解决。回溯是一种递归算法,它尝试构建所有的解,并在发现当前路径不能形成一个完整的解时撤销选择(即回溯)。对于组合问题,回溯法非常适合,因为它允许我们探索所有可能的选项。
为了生成从 1 到 n 的所有 k 数字组合,我们可以按照以下步骤操作:
- 创建一个辅助函数
backtrack,它接受当前起始数字、当前组合和结果列表作为参数。 - 如果当前组合的长度等于 k,则将当前组合添加到结果列表中并返回。
- 否则,迭代从起始数字到 n 的所有数字,对每个数字:
- 将其添加到当前组合中。
- 调用
backtrack函数,将下一个数字作为新的起始数字。 - 撤销选择(移除最后添加的数字),以尝试其他可能性。
- 初始化结果列表并调用辅助函数开始回溯过程。
- 返回结果列表。
下面是 Python 实现代码:
def combine(n: int, k: int):
def backtrack(start=1, current=[]):
# 如果当前组合的长度等于k,添加到结果中
if len(current) == k:
result.append(current[:]) # 使用[:]创建current的副本
return
for i in range(start, n + 1):
current.append(i) # 做出选择
backtrack(i + 1, current) # 进入下一层决策树
current.pop() # 撤销选择
result = []
backtrack()
return result
这段代码实现了上述的回溯算法,用来生成所有可能的 k 个数的组合。combine 函数是主函数,而 backtrack 是内部定义的辅助函数,用于执行实际的回溯逻辑。当 backtrack 找到一个完整的组合时,它会将其复制并添加到最终的结果列表 result 中。这样做是为了避免由于后续修改 current 列表而导致结果被改变的问题。
提交结果

3377

被折叠的 条评论
为什么被折叠?



