Leetcode题目描述
找出所有相加之和为 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]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
回溯剪枝算法
- 建议辅助画图,注意边界,尤其是确定target值的时候
- 注意终止条件,每一次得到结果之后就可以进行终止计算了
回溯剪枝算法Demo
import java.util.ArrayList;
import java.util.List;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res = new ArrayList<>();
backtrack(k, n, 1, new ArrayList<>(), res);
return res;
}
/**
*
* @param num 还可以使用数字的数量
* @param target 可以用于计算的结果值
* @param start 去重的关键,记录下一次开始的位置
* @param tmp 一次成功的结果
* @param res 所有结果
*/
public void backtrack(int num, int target, int start, List<Integer> tmp, List<List<Integer>> res){
if(target < 0) return;
if ( num == 0){
if( target == 0){
res.add(new ArrayList<>(tmp));
return;
}
return;
}
for(int i = start; i <= target; i++){
tmp.add(i);
backtrack(num - 1, target - i, i + 1, tmp, res);
tmp.remove(tmp.size() - 1);
}
}
}