1. 题目描述

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

示例:

  1. 输入: n = 4, k = 2
  2. 输出:
  3. [
  4. [2,4],
  5. [3,4],
  6. [2,3],
  7. [1,2],
  8. [1,3],
  9. [1,4],
  10. ]

2. 实现思路

这道题目运用到了普通的回溯剪枝以及深度优先遍历。

原本应该是这样的:
77. 组合 - 图1
我们可以看到,里面有很多的重复项,所以可以对其进行剪枝操作,即每次递归时开始数+1,剪枝之后就变成了这样:
77. 组合 - 图2
然后继续进行递归操作,当保存路径的数组的长度和k相等是就将结果保存在结果中,并进行回溯操作。

3. 代码实现

  1. /**
  2. * @param {number} n
  3. * @param {number} k
  4. * @return {number[][]}
  5. */
  6. var combine = function(n, k) {
  7. let res = []
  8. // start是路径初始值,arr是保存路径节点的数组
  9. const dfs = (start, arr) => {
  10. if(arr.length === k){
  11. res.push([...arr]) // 数组是引用类型,所以要进行一下拷贝
  12. return
  13. }
  14. // 列举所有的选择
  15. for(let i = start; i <= n; i++){
  16. arr.push(i) // 选中元素
  17. dfs(i+1, arr) // 向下继续遍历选择
  18. arr.pop() // 将元素出数组,便于后面进行回溯
  19. }
  20. }
  21. dfs(1, [])
  22. return res
  23. };

4. 提交结果

77. 组合 - 图3