Open sl1673495 opened 4 years ago
function test(n, k, start=1) { const result = []; for (let index = start; index <= n; index++) { if (k > 1) { const a = test(n, k - 1, index + 1); if (a && a.length) { a.forEach(item => { result.push([index].concat(item)); }); } } else if (k === 1) { result.push([index]); } } return result; }
var combine = function(n, k) {
let res = [];
function tfs(start, path){
let length = path.length;
if(length === k){
res.push([...path]);
return;
}
if(length > k) return;
let rest = k-length;
for(let i=start; i<=n; i++) {
if(rest > n-start+1) break;
path.push(i)
tfs(i+1,path)
path.pop();
}
}
tfs(1,[])
return res;
};
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combinations 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
定义一个 helper 函数,递归的时候接受本次处理的
start
起始位置,和上一次已经取了字符后得到的prev
数组。继续进一步的循环递归,增加start
和拼接prev
即可。当
prev
的长度等于k
时,条件满足,把当前的prev
存入结果数组中。剪枝
在循环中,要考虑当前已经凑成的数组长度和剩下的数字所能凑成的最大长度,对于不可能凑成的情况直接
continue
。