给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
dfs回溯:
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
self.res, self.tmp = [], []
self.helper(n, k, 1)
return self.res
def helper(self, n, k, start):
if len(self.tmp) == k:
self.res.append(self.tmp.copy())
return
for i in range(start, n+1):
self.tmp.append(i)
self.helper(n, k, i+1)
self.tmp.pop()
其实helper中的i,我们不可能到n+1,因为这样只有一个数了,只有k==1时才可能。每次遍历,我们相当于在[start, n]这个区间中取出k-len(tmp)个数,那也就是说[start, n]这个区间中至少要包含k-len(tmp)个数,也就是n-start+1>=k-len(tmp),也就是start<= n - (k-len(tmp))+1,所以:
class Solution:
def combine(self, n: int, k: int):
self.res, self.tmp = [], []
self.helper(n, k, 1)
return self.res
def helper(self, n, k, start):
if len(self.tmp) == k:
self.res.append(self.tmp.copy())
return
for i in range(start, n-(k-len(self.tmp))+2):
self.tmp.append(i)
self.helper(n, k, i+1)
self.tmp.pop()