这个解决方案使用了回溯法来找出所有可能的k个数的组合。首先,定义一个递归函数fun,它从1到n逐个尝试添加数字到当前组合ans中。如果当前组合的长度到达k,就将其复制后添加到结果列表count中。如果组合未完成,函数继续递归尝试当前数字i的下一个数字i+1。此外,函数在尝试每个数字后,都会将其从组合中移除(回溯),然后尝试下一个数字。此解法还包含一个剪枝的优化:如果当前可选的数字数量小于所需的数量,就提前终止递归。
时间复杂度: O(2^n)
空间复杂度: O(n + k)
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
count = [] # 结果列表
ans = [] # 当前组合
def fun(i):
# 剪枝:如果剩余数字不足以填满组合,则终止递归
if n - i + 1 < k - len(ans):
return
# 如果当前组合长度等于k,则复制并添加到结果列表
if len(ans) == k:
count.append(ans[:])
return
# 尝试包含当前数字i
ans.append(i)
fun(i + 1)
# 回溯:移除当前数字并尝试下一个数字
ans.pop()
fun(i + 1)
fun(1)
return count