dfs + 剪枝
dfs(1, []); 1~n,从1开始分支,分两种情况:
- 选了1
- 没有选1
选了
1了,进一步从2开始,又分两种情况,选了2和没有选2....等,直到长度到k了则push到res中
在此过程中,存在坏的分支情况,需要过滤掉,如下
if (arr.length + (n - i + 1) < k) return; 解释为已入选的个数 + 剩下候选的个数 < k了,需要裁掉,因为不管怎么选都不能满足 === k的要求
var combine = function (n, k) {
var res = [];
dfs(1, []);
return res;
function dfs(i, arr) {
if (arr.length + (n - i + 1) < k) return;
if (arr.length == k) {
res.push(arr);
return;
}
dfs(i + 1, [...arr, i]);
dfs(i + 1, arr);
}
};
题目要求的1-n数组太过特殊,我们可以进行数组一般化,再进一步求解
var combine = function (n, k) {
var brr = []
for (var j = 1; j <= n; j++) {
brr.push(j)
}
var len = brr.length
var res = [];
dfs(0, []);
return res;
function dfs(i, arr) {
if (arr.length + (len - i) < k) return;
if (arr.length == k) {
res.push(arr);
return;
}
dfs(i + 1, [...arr, brr[i]]);
dfs(i + 1, arr);
}
};