法1
想法:
- 该题与JavaScript|LeetCode|搜索|39.组合总和、JavaScript|LeetCode|搜索|40.组合总和Ⅱ相似,根据题目描述的不同修改代码
- candidates自己创建,包含9~1
- 递归结束的条件加上:k与组合长度的判断
- candidates中不包含重复的数字,所以无需通过判断candidates[i]是否等于candidates[i - 1]来剪枝
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function(k, n) {
var output = [], temp = [], candidates = [];
var i = 9;
for(i = 9; i > 0; i--) {
candidates[candidates.length] = i; // 9 ~ 1
}
for(i = 0; i < candidates.length; i++) {
if(candidates[i] > n) {
continue;
}
temp.push(candidates[i]);
doCombinationSum(candidates.slice(i + 1), n - candidates[i], temp, output, k);
temp.pop();
}
return output;
};
function doCombinationSum(candidates, n, temp, output, k) {
if(n == 0 || k == temp.length) {
if(n == 0 && k == temp.length) {
output.push(temp.concat([]));
}
return;
}
var i = 0;
for(i = 0; i < candidates.length; i++) {
if(candidates[i] > n) {
continue;
}
temp.push(candidates[i]);
doCombinationSum(candidates.slice(i + 1), n - candidates[i], temp, output, k);
temp.pop();
}
}