思路
组合问题需要用到回溯,假设n = 4,k = 2,从1开始,path表示每一层的收集值,选中1以后,下一个数就需要从2开始,我们startIndex表示开始的位置,1->2以后我们收集到的结果满足k了就需要存放到result最终结果集中,⚠️:结果集存放的时候不要直接push(path),因为path是存的地址,如果path后序改变,也会影响这个存入的数据,所以需要拷贝一份出来存储
存放以后我们需要再回退到1的位置去继续找后面的数字存储,由于有一个回退的操作,我们需要path.pop,这样就再次回到了path = [1],然后startIndex = 3,这样就继续往后面找数,就能实现回溯找到所有的组合值
实现
var combine = function (n, k) {
let result = [], path = [];
const backtracking = (n, k, startIndex) => {
if (path.length === k) {
// 此路径收集完成
result.push([...path]);
return
}
for (let i = startIndex; i <= n; i++) {
path.push(i);
backtracking(n, k, i + 1)
path.pop();
}
}
backtracking(n, k, 1)
return result;
};