回溯算法理论知识:
77 组合:
思路: 找到一个从1-n的list中所有的 k 个元素的组合。 容易想到, 如果k=1, 那么输出这个list 中的元素组成的二维list, 如果 k = n 返回 [input_list], 如果 k > n 返回空。如果k > 1 呢? 那么可以先抽出 1, 然后在 2-n 中找出 k-1 的组合, 再把1 加进去, 然后抽出2, 然后在 3-n 中找出 k-1 的组合, 再把2加进去。。。。
难点: 退出迭代的条件
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
def backtracking(n1: int, n2: int, k: int):
if k == 1:
return [[i] for i in range(n1, n2+1)]
if k == n2 - n1 + 1:
return [list(range(n1, n2+1))]
if k > n2 - n1 + 1:
return []
comb = []
for j in range(n1, n2):
_comb = backtracking(j+1, n2, k-1)
comb += [[j] + one_comb for one_comb in _comb]
return comb
return backtracking(1, n, k)