📜  门| GATE CS 2021 |设置 1 |第 53 题(1)

📅  最后修改于: 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