之前也做了快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; }