216. 组合总和 III
题目描述
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明
所有数字都是正整数。
解集不能包含重复的组合。
示例 1
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
思路
回溯
- 定义 temp 数组存放组合 count计算组合元素总和
- 终止条件: 数组 temp 的长度为 k
- 回溯: 从 开始值 到 9 进行选取 并更新 count 值
for(let i = s; i <= 9; i++){
count += i;
temp.push(i);
backTracking(k, n, i + 1, count);
count -= i;
temp.pop();
}
- 剪枝
- count值 大于 n 时 可直接退出
- 遍历次数 可以 减少至 9 - ( k - temp.length )+ 1
9 代表 只允许含有 1 - 9 的正整数
k - temp.length 表示 还能取多少个数字
+1 表示从当前数值的后一个数字开始算
代码
/**
* @param {number} k
* @param {number} n
* @return {number[][]}
*/
var combinationSum3 = function(k, n) {
let result = [];
let temp = [];
let backTracking = function (k, n, s, count){
if(count > n){
return;
}
if(temp.length === k){
if(count === n){
result.push([...temp]);
}
return;
}
let len = temp.length;
let max = 10 - k + len;
for(let i = s; i <= max; i++){
count += i;
temp.push(i);
backTracking(k, n, i + 1, count);
count -= i;
temp.pop();
}
}
backTracking(k, n, 1, 0);
return result;
};