给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
ans = []
def completePermutation(tmp, idx):
if len(tmp) == k:
ans.append(tmp[:])
for i in range(idx, n + 1):
tmp.append(i)
completePermutation(tmp, i + 1)
tmp.pop()
completePermutation([], 1)
return ans
拓展:
回溯算法函数dfs
第一个参数cur表示临时答案,在供选数组里取第一个元素,对于它,我们有两种选择,选 或者 不选
第二个参数nums表示供选的数组,
子集:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[]
def dfs(cur,nums):
if not nums:
res.append(cur)
return
dfs(cur+[nums[0]],nums[1:])
dfs(cur,nums[1:])
dfs([],nums)
return res
组合:
组合不过是在所有子集里,筛选出符合要求题目要求的,即只保留长度等于K的子集而已。
def combine(self, n: int, k: int) -> List[List[int]]:
res=[]
nums=list(range(1,n+1))
def dfs(cur,nums):
if not nums :
if len(cur)==k:
res.append(cur)
return
dfs(cur+[nums[0]],nums[1:])
dfs(cur,nums[1:])
dfs([],nums)
return res