给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
思路:回溯函数传入n,k和选择的元素位置startIndex,在每层递归中,从startIndex开始循环到 n - (k - path.length) + 1的位置,将这些数加入path,然后startIndex加1,继续递归函数进入下一个分支,完成调用之后回溯状态,当path的长度等于k的时候终止这层分支,加入结果中
const combine = (n, k) => {
let res = []
const helper = (startIndex,path)=>{
if(path.length === k){
res.push(path.slice())
return
}
for(let a = startIndex; a <= n - (k - path.length) + 1; a++) { // 剪枝
path.push(a); //加入path
helper(a + 1, path); //下一层递归
path.pop() // 回溯
}
}
helper(1,[])
return res
}
combine(4,2)