递归实现组合型枚举

1,023 阅读1分钟

之前也做了快50道题了,结果发现都是昙花一现,脑海里什么都没留下。决定遇见一个新的题型就在这里总结一下。记录一下自己的成长轨迹。

组合型枚举

从n个当中选取k个的所有方案对应的枚举是组合型枚举

题目

LeetCode题目: leetcode-cn.com/problems/co…

给定两个整数n和k,返回 1 ...n中所有可能的k个数的组合

示例:

输入: n = 4, k = 2
输出: [ [2,4],  [3,4],  [2,3], [1,2], [1,3], [1,4], ]

递归实现二进制枚举(子集枚举)

原序列每个数字分为选中和不选中两种。使用temp存储选中的数字。在dfs(cur, n) 进入之前,[1, cur - 1] 是确定的, [cur, n] 是不确定的。dfs(cur, n) 需要确定cur位置的数字状态,然后求解子问题dfs[cur + 1, n]。我们默认cur位置的数组被选中。需要把cur对应的数字放入数组temp。在执行dfs(cur+1, n).执行结束后需要对temp进行回溯,cur是递增的,当cur增加到n+1时,记录答案终止递归

  • temp.add(cur)  表示考虑当前位置
  • temp.remove(temp.size() - 1)  表示不考虑当前位置。进行回溯
  • cur == n + 1   记录答案终止递归

递归实现组合型枚举

  • 如果当前的temp的长度为s,未确定的数字[cur, n] 长度为t,如果s + t < k,那么剩余的[cur, n] 数字都被选中,长度也不满足k。因此,该情况没有必要继续递归。

    if (temp.size() + (n - cur + 1) < k) {
        return;
    }