声明:只求用最简单的方法通过,不求优化,不喜勿喷
- dfs求解
- 每次递归传入当前的和以及已经取到的最大的数字
- 如果传入的和已经超过目标或者当前取的数字数量已经超过目标,则结束递归
- 每次取从已经取到数字开始的全部数字,如果和还比目标小则继续递归查找
- 满足总和以及取的数字数量一样的放入结果集中
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function (k, n) {
let now = [];
let re = [];
let dfs = function (sum, idx) {
if (sum > n || now.length > k) {
return;
}
if (sum == n && k == now.length) {
re.push([...now]);
return;
}
for (var i = idx + 1; i <= 9; i++) {
if (sum + i <= n && now.length + 1 <= k) {
now.push(i);
dfs(sum + i, i);
now.pop();
}
}
}
dfs(0,0)
return re;
};