Skip to main content

77.组合

标签: backtracking

难度: Medium

通过率: 71.83%

原题链接: https://leetcode.com/problems/combinations/description/

题目描述

给定两个整数 nnkk,返回从范围 [1,n][1, n] 中选取 kk 个数的所有可能组合。你可以按任何顺序返回答案。

解题思路

为了解决组合问题,我们可以使用回溯法。回溯法是一种进行深度优先搜索的算法,专门适用于求解满足某些条件的所有可能解。具体思路如下:

  1. 初始化一个空列表 result 用于存储所有满足条件的组合。
  2. 使用回溯函数 backtrack(start, path),其中 start 表示从哪个数开始选择,path 是当前选择的数字路径:
    • 如果 path 的长度达到 k,将其添加到 result 中。
    • 遍历从 startn 之间的所有数 i
      • i 添加到 path 中。
      • 递归调用 backtrack(i + 1, path) 去找出下一个符合条件的数字。
      • 回撤到上一层,从 path 删除 i,以便尝试其他候选数字。
  3. 最后返回 result

这种方法利用了回溯的思想,即尝试每一条可能的路径并在不满足条件时回溯,保证不会遗漏任何一个可能的组合。

代码实现

def combine(n, k):
def backtrack(start, path):
# 如果当前组合长度等于 k,添加到结果集
if len(path) == k:
result.append(path[:])
return
# 从 start 开始尝试
for i in range(start, n + 1):
path.append(i) # 选择 i
backtrack(i + 1, path) # 向后推进一位
path.pop() # 撤销选择,回溯
result = []
backtrack(1, [])
return result

复杂度分析

时间复杂度:O((nk)k)O(\binom{n}{k} \cdot k),其中 (nk)\binom{n}{k} 是组合数,kk 是每个组合的长度。 空间复杂度:O(k)O(k),递归函数的栈空间最大深度是 kk