📅  最后修改于: 2023-12-03 15:12:37.614000             🧑  作者: Mango
给定两个正整数 n 和 k,找到所有可能的 k 个数字的组合,这些数字在 1 到 n 之间,但这些组合必须包含且仅包含数字 1、2 和 3。
def findCombinations(n: int, k: int) -> List[List[int]]:
pass
输入:
n = 4
k = 2
输出:
[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]
当前题目要求我们找到所有 k 个数字的组合,其中每个数字都要属于范围 [1,n],而且这些组合必须只包含数字 1、2 和 3。按照深度优先搜索(DFS)的思想,我们仍旧可以使用递归的方式去完成。
假设我们已经选择了若干个数字,并且当前的选择个数是 curr_k。如果 curr_k < k,那么我们就需要递归地去选择下一个数字。而对于选择下一个数字的条件,我们需要注意一下:
1.选择的数字必须属于范围 [last+1, n],其中 last 表示上一个已经被选择的数字。
2.目前为止已经被选择的数字都要满足只包含数字 1、2 和 3。
通过这两个条件,我们就可以递归选择下一个数字,并且检查当前已经被选择的数字个数是否到了 k。
from typing import List
def findCombinations(n: int, k: int) -> List[List[int]]:
def dfs(curr: List[int], curr_k: int, last: int):
if curr_k == k:
res.append(curr[:])
return
for i in range(last+1, n+1):
if i in {1, 2, 3}:
curr.append(i)
dfs(curr, curr_k+1, i)
curr.pop()
res = []
dfs([], 0, 0)
return res