Algorithms first

组合 · 交互式算法学习

返回 1..n 中所有 k 个数的组合。

#77 · 回溯

组合

Combinations

测试用例n = 4, k = 2
递归树3 个关键状态
步骤 1选择 1 后只枚举 2..4。path=[1]
1234
推荐

按下一个数回溯并剪枝

时间 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}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

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 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

组合 · 解法对比

返回 1..n 中所有 k 个数的组合。

测试用例
n = 4, k = 2
题目分类
回溯
解法对比
2
方案 1

枚举所有子集再筛长度

每个数字都有选或不选两支,叶子只保留长度 k。

时间
O(2^n)
空间
O(n)
方案 2

按下一个数回溯并剪枝

从 start 枚举下一个数字;剩余数量不足时不再进入分支。

时间
O(C(n,k)·k)
空间
O(k)