往期博客:
目录
题目
给定两个整数
n
和k
,返回范围[1, n]
中所有可能的k
个数的组合。你可以按 任何顺序 返回答案。
题目分析
已知:两个整数 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 = 4, k = 2,表示在[1,2,3,4]中找两个数进行组合,注意组合无序且不能重复
我们可以先选出第一个数字1,那么第二个数字可以从剩余的[2,3,4]中选择,然后再选2作为第一个数,从[3,4]中选择第二个数,这个过程其实就是回溯的过程
具体过程是首先选择第一个数为1,然后选择第二个数为2,构成组合[1,2],然后进行回溯到第一个数1的状态,选择第二个数为3,构成组合[1,3],再次回溯到第一个数1的状态,选择第二个数为4,构成组合[1,4],此时第一个数为1的所有组合已经找到,进行回溯,选择第一个数2,重复上述过程
代码
回溯法
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result = []
self.backtracking(n, k, result, 1, [])
return result
def backtracking(self, n, k, result, begin, ls):
# 递归终止条件
if len(ls) == k:
result.append(ls[:])
return
for i in range(begin,n+1):
ls.append(i)
self.backtracking(n, k, result, i+1, ls)
ls.pop() # 将第二个数删除,从而进行回溯找到新的第二个数,构建新的组合