Algorithms first
组合 · 交互式算法学习
返回 1..n 中所有 k 个数的组合。
#77 · 回溯
组合
Combinations
n = 4, k = 2递归树3 个关键状态
步骤 1选择 1 后只枚举 2..4。
path=[1]推荐
按下一个数回溯并剪枝
时间
O(C(n,k)·k)空间 O(k)从 start 枚举下一个数字;剩余数量不足时不再进入分支。
1function combine(n, k) {2 const out = [];3 4 function dfs(start, path) {5 if (path.length === k) {6 out.push([...path]);7 return8 }9 for (let x = start; x <= n - (k - path.length) + 1; x++) {10 path.push(x);11 dfs(x + 1, path);12 path.pop()13 }14 }15 dfs(1, []);16 return out;17}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 private List<List<Integer>> ans = new ArrayList<>();3 private List<Integer> t = new ArrayList<>();4 private int n;5 private int k;6 7 public List<List<Integer>> combine(int n, int k) {8 this.n = n;9 this.k = k;10 dfs(1);11 return ans;12 }13 14 private void dfs(int i) {15 if (t.size() == k) {16 ans.add(new ArrayList<>(t));17 return;18 }19 if (i > n) {20 return;21 }22 t.add(i);23 dfs(i + 1);24 t.remove(t.size() - 1);25 dfs(i + 1);26 }27}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
组合 · 解法对比
返回 1..n 中所有 k 个数的组合。
- 测试用例
n = 4, k = 2- 题目分类
- 回溯
- 解法对比
- 2
枚举所有子集再筛长度
每个数字都有选或不选两支,叶子只保留长度 k。
- 时间
O(2^n)- 空间
O(n)
按下一个数回溯并剪枝
从 start 枚举下一个数字;剩余数量不足时不再进入分支。
- 时间
O(C(n,k)·k)- 空间
O(k)